这是课程,我想获得其中使用的所有类型的列表:
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中专门使用的类型)。
答案 0 :(得分:1)
如果您想知道用于方法/文件/属性的类型 - 使用基本反射来枚举每个方法/字段并获取声明中使用的类型。
即。对于方法,您可以调用Type.GetMethods
,然后挖掘MethodInfo
之类的MethodInfo.ReturnType属性来获取已使用的类型。可能通过递归遍历每个基类/接口来查找所有依赖项。
如果你想知道在方法中使用什么类型,你需要使用某种IL解析器,因为反射不能提供窥视方法体的方法。样本可以在Get types used inside a C# method body中找到。
请注意,现有的工具已经提供了类似的功能 - 即ReSahrper根据模块"找到代码"和"找到类型/方法的用法/..."。
答案 1 :(得分:0)
它回归了预期。 Type.Assembly
返回声明类型的程序集(.dll,.exe)。在您的情况下,程序集是您项目的输出。因此GetTypes
将返回该程序集中包含的所有类型。
您可以通过枚举Type中声明的方法和属性来实现。这可以通过调用Type.GetMethods
和Type.GetProperties
方法完成。
这样的事情:
foreach(PropertyInfo prop in typeof(TestClass).GetProperties)
{
//Access types.
}
foreach(MethodInfo method in typeof(TestClass).GetProperties)
{
//Access types.
}
答案 2 :(得分:0)
您需要System.Assembly.GetReferencedAssemblies()
,因此:
using System.Reflection;
...
Assembly assembly = Assembly.LoadFile(@"c:\path\to\some\arbitrary-assembly.dll");
AssemblyName[] dependencies = assembly.GetReferencedAssemblies();
作为练习,读者可以构造递归树遍,以枚举完整的直接和间接程序集。有人可能会注意到这将需要加载每个引用的程序集。考虑在独立流程中进行此类检查或将程序集加载到reflection-only context。