我正在研究一种提取彼此之间的所有类关联的解决方案。如果我们在对象浏览器中单击一个类,我们可以看到该选项Find All References
。我想要类似的东西来找到一个类与其他类的关联。我们如何使用 找到它们Reflection
?
我有兴趣提取
- 组成关系:
- 聚合关系
- 关联关系
- 遗产
我正在研究一种提取彼此之间的所有类关联的解决方案。如果我们在对象浏览器中单击一个类,我们可以看到该选项Find All References
。我想要类似的东西来找到一个类与其他类的关联。我们如何使用 找到它们Reflection
?
我有兴趣提取
您可以使用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 将(几乎)告诉您FieldInfo
、PropertyInfo
和MethodInfo
的所有秘密ParameterInfo
。您还可以考虑检查类、事件等的通用参数。
您需要解析生成的 IL 代码,最好了解它们的工作原理。您可以通过调用MethodBase.GetMethodBody后跟MethodBody.GetILAsByteArray来检索 IL 代码。
您需要根据OpCodes枚举解析每个字节。您还需要处理所有操作码数据,例如偏移量和令牌,因为您不应该将它们解析为实际操作码。以OpCodes.Ldstr操作码为例;它由 0x72 后跟一个令牌组成。这个标记是四个字节,应该被解析为一个 Int32,并且可以使用 Module.ResolveString来解析(因为你知道 ldstr 有一个字符串标记)。您可以从Assembly.AssemblyManifestModule获取Module实例。