Итерации классов с осязаемым VisualStudioHelper

Я пытаюсь перебрать все классы, которые наследуют определенный базовый класс. Большинство ссылок я нахожу ссылкой на T4 Editor. Как этот так ответ, который почти делает то, что я хочу

Get-все-метода, которые, которые оформлены, с-a-% 20specific-атрибуты с использованием-t4-EnvDTE

Проблема в том, что я не могу найти методы, которые он использует, как GetAllCodeElementsOfType

Я использую этот шаблон

Я использую правильный шаблон?

1 ответ

Решение

Вот вспомогательные методы, которые я написал, чтобы получить все подклассы, реализующие определенный базовый класс

public IEnumerable<CodeClass> GetSubClasses(string baseClass, Project project)
{
    var classes = VisualStudioHelper.CodeModel.GetAllCodeElementsOfType(project.CodeModel.CodeElements, EnvDTE.vsCMElement.vsCMElementClass, false);
    var subClasses = new List<CodeClass>();
    foreach (CodeClass @class in classes)
    {
        foreach (CodeClass @base in GetInheritance(@class))
        {
            if (@base.FullName == baseClass)
                subClasses.Add(@class);
        }

    }

    return subClasses;
}

public IEnumerable<CodeClass> GetInheritance(CodeClass @class)
{
    return GetInheritance(@class, new List<CodeClass>());
}

public IEnumerable<CodeClass> GetInheritance(CodeClass @class, List<CodeClass> collection)
{
    foreach (CodeClass @base in @class.Bases)
    {
        collection.Add(@base);
        GetInheritance(@base, collection);
    }

    return collection;
}

Я перепишу их с Linq, я обнаружил, что если вы сделаете.Cast<> для нетипизированных массивов, вы можете использовать Linq, чтобы сделать код немного чище

Другие вопросы по тегам