0

我正在研究一种提取彼此之间的所有类关联的解决方案。如果我们在对象浏览器中单击一个类,我们可以看到该选项Find All References。我想要类似的东西来找到一个类与其他类的关联。我们如何使用 找到它们Reflection

我有兴趣提取

  1. 组成关系:
  2. 聚合关系
  3. 关联关系
  4. 遗产
4

2 回答 2

1

您可以使用Reflection来列出类的所有属性、字段和方法(以及更多)。您必须检查这些并确定它们的类型和参数列表。从命名空间中丢弃类型可能是个好主意System

Type t = typeof(MyClass);

// Determine from which type a class inherits
Type baseType = t.BaseType;

// Determine which interfaces a class implements
Type[] interfaces = t.GetInterfaces();

// Get fields, properties and methods
const BindingFlags bindingFlags =
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
FieldInfo[] fields = t.GetFields(bindingFlags);
PropertyInfo[] properties = t.GetProperties(bindingFlags);
MethodInfo[] methods = t.GetMethods(bindingFlags);

foreach (var method in methods) {
    // Get method parameters
    ParameterInfo[] parameters = method.GetParameters();
}

Intellisense 将(几乎)告诉您FieldInfoPropertyInfoMethodInfo的所有秘密ParameterInfo。您还可以考虑检查类、事件等的通用参数。

于 2012-04-30T15:37:13.293 回答
1

您需要解析生成的 IL 代码,最好了解它们的工作原理。您可以通过调用MethodBase.GetMethodBody后跟MethodBody.GetILAsByteArray来检索 IL 代码。

您需要根据OpCodes枚举解析每个字节。您还需要处理所有操作码数据,例如偏移量和令牌,因为您不应该将它们解析为实际操作码。以OpCodes.Ldstr操作码为例;它由 0x72 后跟一个令牌组成。这个标记是四个字节,应该被解析为一个 Int32,并且可以使用 Module.ResolveString来解析(因为你知道 ldstr 有一个字符串标记)。您可以从Assembly.AssemblyManifestModule获取Module实例。

于 2012-04-30T15:49:06.157 回答