【问题标题】:Get types used inside a specific class获取特定类中使用的类型
【发布时间】:2015-06-13 18:34:07
【问题描述】:

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

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 中专门使用的类型)。

【问题讨论】:

  • 您为什么要这样做?你对“二手”的定义是什么?
  • “类型”是指类公开的成员和方法吗?如果是这样,您可能可以为此使用反射。
  • “使用”是指在该类的某处引用。我希望它创建一个工具,让我查看我的项目中是否使用了某个类。

标签: c# class reflection types


【解决方案1】:

如果您想知道方法/文件/属性使用的类型 - 使用基本反射枚举每个方法/字段并获取声明中使用的类型。

即对于您调用Type.GetMethods 的方法,而不是挖掘MethodInfo 属性,如MethodInfo.ReturnType 以获取使用的类型。可能通过每个基类/接口递归地查找所有依赖项。

如果您想知道方法内部使用了哪些类型,则需要使用某种 IL 解析器,因为反射不提供窥探方法主体的方法。样本可以在Get types used inside a C# method body找到。

请注意,现有工具已经提供类似功能 - 即 ReSahrper 具有“根据模块查找代码”和“查找类型/方法/...的用法”。

【讨论】:

  • 我真的认为 GetTypes() 方法为我做了这些......哦,好吧,谢谢你的澄清,现在我找不到任何例子是有道理的。跨度>
【解决方案2】:

你需要System.Assembly.GetReferencedAssemblies(),因此:

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

留给读者练习构建递归树遍历以枚举完整的直接和间接程序集集。有人可能会注意到,这将需要加载 每个 引用的程序集。考虑在独立进程中进行此类检查或将程序集加载到reflection-only context

【讨论】:

    【解决方案3】:

    它正在返回预期的内容。 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.
    }
    

    【讨论】:

      猜你喜欢
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多