如何验证类型是否重载/支持某个运算符?

时间:2011-12-15 16:09:23

标签: c# reflection operators

如何检查某种类型是否实现某个运算符?

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 个答案:

答案 0 :(得分:6)

您应该检查类是否具有op_Addition名称的方法 您可以找到重载的方法名称here
希望这有帮助

答案 1 :(得分:3)

一种名为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 :(得分:2)

有一种快速而肮脏的方法可以找到它,它适用于内置和自定义类型。它的主要缺点是它依赖于正常流程中的异常,但它完成了工作。

 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;
    }
}