CIL说明:检查是否调用了getter方法?

时间:2010-11-24 22:30:03

标签: c# .net algorithm cil instructions

我使用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方法?以及如何检测返回哪个字段?

1 个答案:

答案 0 :(得分:3)

正如Donnie在评论中所说,吸气剂和制定者就像任何其他方法一样。他们可以随心所欲地返回任何他们想要的东西,也可以像他们想要的那样复杂。等等。无论你做什么,最多只会是一个有根据的猜测。

首先,您可以查看MethodDefinition的语义属性。如果它说方法是吸气剂或设定者,至少你会知道它是否附在一个属性上。

现在,您还可以分析IL以尝试查找某种模式,就像我在博客文章中所做的那样retrieving the backing field of a property。你必须调整代码才能使用Mono.Cecil而不是Mono.Reflection,但它不应该是一个大问题。