Проверьте, не перегружает ли тип свойства оператор == с помощью 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, который мне нужно ввести в эти сеттеры, выглядит примерно так:

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

То же самое касается Property2. Проблема в том, что Property2 имеет тип string, который перегружает оператор ==, а в коде IL вместо ceq мне нужно вызывать op_Equality. Мой вопрос: есть ли способ проверить, переопределен ли оператор == для типа свойства с помощью Mono.Cecil?


person Vladimir Djurdjevic    schedule 19.08.2015    source источник


Ответы (1)


Ну, это на самом деле легко. Я создал класс

 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
                        }
                    }
                }
            }
person netaholic    schedule 19.08.2015
comment
Да, это оно. :) Моя проблема заключалась в том, что у меня был объект FieldDefinition, а его свойство FieldType не имело свойства Methods, поэтому я не мог так проверить. Я решил проблему с методом FieldDefinition.FieldType.Resolve(), который возвращал TypeDefinition объект, а затем было легко проверить op_Equality его существование. :) - person Vladimir Djurdjevic; 19.08.2015