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

Вот класс, который я хочу получить список всех типов, используемых в нем:

public class TestClass : MonoBehaviour{
    private UIManager _manager;

    private void Initialize(UIManager manager){
        _manager = manager;
    }
}

Тогда я подумал, что запустив что-то вроде этого:

    Assembly assembly = typeof (TestClass).Assembly;
    foreach (Type type in assembly.GetTypes()){
        Debug.Log(type.FullName);
    }

Даст мне только тип UIManager. Но вместо этого кажется, что он дает мне список всех типов, используемых в моем проекте.

Как я могу получить только типы, используемые в этом классе?

(как вы можете видеть, TestClass наследует от MonoBehaviour, но я не хочу, чтобы используемые там типы, я хочу, чтобы типы использовались специально в TestClass).

3 ответа

Решение

Если вы хотите знать, какие типы используются для методов / файлов / свойств - используйте базовое отражение для перечисления каждого из методов / полей и типов захвата, используемых в объявлении.

Т.е. для метода, который вы бы назвали Type.GetMethods и чем копаться MethodInfo свойства как MethodInfo.ReturnType, чтобы получить используемые типы. Потенциально пройти рекурсивно через каждый базовый класс / интерфейс, чтобы найти все зависимости.

Если вы хотите узнать, какие типы используются внутри методов, вам нужно использовать какой-то синтаксический анализатор IL, так как рефлексия не дает возможности заглянуть в тело метода. Пример можно найти в типах Get, используемых внутри тела метода C#.

Обратите внимание, что уже существуют инструменты, которые уже предоставляют аналогичную функциональность - т.е. ReSahrper имеет "найти код в зависимости от модуля" и "найти использование для типов / методов /...".

Он возвращает то, что ожидается. Type.Assembly возвращает сборку (.dll,.exe), в которой объявлен тип. В вашем случае сборка является результатом вашего проекта. Следовательно GetTypes вернет все типы, содержащиеся в этой сборке.

То, что вы хотите сделать, может быть достигнуто путем перечисления методов и свойств, объявленных в вашем типе. Это делается путем вызова Type.GetMethods а также Type.GetProperties метод.

Что-то вроде этого:

foreach(PropertyInfo prop in typeof(TestClass).GetProperties)
{
    //Access types.
}

foreach(MethodInfo method in typeof(TestClass).GetProperties)
{
    //Access types.
}

Тебе нужно System.Assembly.GetReferencedAssemblies(), таким образом:

using System.Reflection;
...
Assembly       assembly     = Assembly.LoadFile(@"c:\path\to\some\arbitrary-assembly.dll");
AssemblyName[] dependencies = assembly.GetReferencedAssemblies();

Для читателя оставлено упражнение по построению рекурсивного обхода дерева для перечисления полного набора прямых и косвенных сборок. Можно заметить, что для этого потребуется загрузка каждой ссылки на сборку. Рассмотрите возможность проведения такого рода экзаменов в автономном процессе или загрузки сборок в контекст только для отражения.

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