1

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

4

1 回答 1

3

正如 Donnie 在评论中建议的那样,getter 和 setter 就像任何其他方法一样。他们几乎可以返回任何他们想要的东西,可以像他们想要的那样复杂,等等。所以无论你做什么,充其量只是一个有根据的猜测。

首先,您可以查看 MethodDefinition 的语义属性。如果它说该方法是 getter 或 setter,至少您会知道它是否附加到属性。

现在,您还可以分析 IL 以尝试找到某种模式,就像我在关于检索属性的支持字段的博客文章中所做的那样。您必须调整代码以使用 Mono.Cecil 而不是 Mono.Reflection,但这应该没什么大不了的。

于 2010-11-24T22:54:55.607 回答