代码之家  ›  专栏  ›  技术社区  ›  anon

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

  •  1
  • anon  · 技术社区  · 14 年前

    我用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 回复  |  直到 14 年前
        1
  •  3
  •   Jb Evain    14 年前

    正如唐尼在评论中指出的,getter和setter和其他方法一样。他们可以返回几乎任何他们想要的,是复杂的,因为他们想要,等等。所以无论你将做什么,充其量将是一个有教育意义的猜测。

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

    现在,您还可以分析IL,试图找到某种模式,就像我在博客中关于 retrieving the backing field of a property . 您需要调整代码以使用mono.cecil而不是mono.reflection,但这不应该是什么大问题。

    推荐文章