Получить типы, используемые внутри определенного класса
Вот класс, который я хочу получить список всех типов, используемых в нем:
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();
Для читателя оставлено упражнение по построению рекурсивного обхода дерева для перечисления полного набора прямых и косвенных сборок. Можно заметить, что для этого потребуется загрузка каждой ссылки на сборку. Рассмотрите возможность проведения такого рода экзаменов в автономном процессе или загрузки сборок в контекст только для отражения.