获取特定类中使用的类型

时间:2015-04-08 16:54:57

标签: c# class reflection types

这是课程,我想获得其中使用的所有类型的列表:

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 个答案:

答案 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.GetMethodsType.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