我使用Mono.Cecil解析类型。我如何检查类型im解析是否正在访问getter其他类的方法?
为了直接访问这些字段,我找到了一个解决方案:
foreach (MethodDefinition method in type.Methods)
{
foreach (Instruction instruction in method.Body.Instructions)
{
if (instruction.OpCode == OpCodes.Ldfld)
{
FieldReference field = instruction.Operand as FieldReference;
if (fields.Contains(field.ToString()) && !accesses.Contains(field.ToString()))
{
accesses.Add(field.ToString());
Console.WriteLine("Class " + type.Name + " accesses field " + field.Name + " of a foreign class.");
}
}
}
}
但是如果getter方法访问另一个类的字段,我怎么能解决问题呢?
或者为了简化问题:如何确定方法是否是使用CIL指令的getter方法?以及如何检测返回哪个字段?
答案 0 :(得分:3)
正如Donnie在评论中所说,吸气剂和制定者就像任何其他方法一样。他们可以随心所欲地返回任何他们想要的东西,也可以像他们想要的那样复杂。等等。无论你做什么,最多只会是一个有根据的猜测。
首先,您可以查看MethodDefinition的语义属性。如果它说方法是吸气剂或设定者,至少你会知道它是否附在一个属性上。
现在,您还可以分析IL以尝试查找某种模式,就像我在博客文章中所做的那样retrieving the backing field of a property。你必须调整代码才能使用Mono.Cecil而不是Mono.Reflection,但它不应该是一个大问题。