如何验证类型是否重载/支持某个操作符



如何检查某个类型是否实现了某个操作符?

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 )

您应该检查类是否具有op_Addition名称的方法你可以在这里找到重载的方法名,
希望对大家有所帮助

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

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

一个叫做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"的普通方法;

您可以使用dynamic关键字,该关键字仅在运行时求值。

using System.Dynamic;
public static bool TryAdd<T>(T a, T b, out T result)
{
    dynamic _a = a, _b = b;
    try {
        result = (_a + _b);
        return true;
    } catch {}
    result = default;
    return false;
}

注意,该方法还将两个值相加。

这仍然可以进一步优化,因为将类型转换为dynamic将执行装箱,反之亦然。

相关内容

  • 没有找到相关文章

最新更新