Как проверить, что тип перегружает / поддерживает определенный оператор? - PullRequest
8 голосов
/ 15 декабря 2011

Как я могу проверить, реализует ли определенный тип определенный оператор?

struct CustomOperatorsClass
{
    public int Value { get; private set; }


    public CustomOperatorsClass( int value )
        : this()
    {
        Value = value;
    }

    static public CustomOperatorsClass operator +(
        CustomOperatorsClass a, CustomOperatorsClass b )
    {
        return new CustomOperatorsClass( a.Value + b.Value );
    }
}

После двух проверок должно возвращаться true:

typeof( CustomOperatorsClass ).HasOperator( Operator.Addition )
typeof( int ).HasOperator( Operator.Addition )

Ответы [ 3 ]

6 голосов
/ 15 декабря 2011

Вы должны проверить, есть ли в классе метод с op_Addition именем. Вы можете найти перегруженные имена методов здесь ,
Надеюсь, это поможет

3 голосов
/ 15 декабря 2011

Метод расширения с именем HasAdditionOp, подобный следующему:

pubilc static bool HasAdditionOp(this Type t)
{
    var op_add = t.GetMethod("op_Addition");
    return op_add != null && op_add.IsSpecialName;  
} 

Обратите внимание, что IsSpecialName запрещает нормальный метод с именем "op_Addition";

2 голосов
/ 15 декабря 2011

Существует быстрый и грязный способ выяснить это, и он работает как для встроенных, так и для пользовательских типов. Его основным недостатком является то, что он опирается на исключения в нормальном потоке, но он выполняет свою работу.

 static bool HasAdd<T>() {
    var c = Expression.Constant(default(T), typeof(T));
    try {
        Expression.Add(c, c); // Throws an exception if + is not defined
        return true;
    } catch {
        return false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...