检查 属性 类型是否使用 Mono.Cecil 重载 == 运算符

Check if property type overloads == operator with Mono.Cecil

我正在使用 Mono.Cecil 编写一个程序,将一些 IL 代码注入 属性 设置器。问题是我需要在 属性 上使用等于运算符到 IL 内。例如:

public class SomeClass
{
    private int _property1;

    public int Property1 
    {
        get { return _property1; }
        set { _property1 = value; }
    }

    private string _property2;

    public string Property2
    {
        get { return _property2; }
        set { _property2 = value; }
    }
}

并且 IL 我需要在这些 setter 中注入的代码类似于:

if (value != _property1)
{
   //DO SOME STUFF
}

Property2也是如此。问题是 Property2string 类型,它重载了 == 运算符,并且在 IL 而不是 ceq 代码中我需要调用 op_Equality。我的问题是:有什么方法可以检查 == 运算符是否在 属性 类型上使用 Mono.Cecil 被覆盖?

其实很简单。 我创建了一个 class

 public class Foo
    {
        public static bool operator ==(Foo a, Foo b)
        {
            if (System.Object.ReferenceEquals(a, b))
            {
                return true;
            }
            if (((object)a == null) || ((object)b == null))
            {
                return false;
            }
            return a == b;
        }

        public static bool operator !=(Foo a, Foo b)
        {
            return !(a == b);
        }
    }

编译后在mono.cecil

中查看
 AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(path);
            foreach (var item in assembly.Modules)
            {
                foreach (var type in item.Types)
                {
                    foreach (var method in type.Methods)
                    {
                        if (method.IsStatic && method.IsSpecialName && method.IsPublic && method.Name.Contains("op_Equality"))
                        {
                            //that type overides == operator
                        }
                    }
                }
            }