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

Ste*_*ris 9 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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

以下两次检查应返回true:

typeof( CustomOperatorsClass ).HasOperator( Operator.Addition )
typeof( int ).HasOperator( Operator.Addition )
Run Code Online (Sandbox Code Playgroud)

Ars*_*yan 6

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

  • @ArsenMkrt不幸的是,`typeof(int).GetMethod("op_Addition")`返回`null`。 (2认同)

das*_*ght 4

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

 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 看起来像“异常驱动编程”,但我不得不承认这是制定一个简短、干净的方法来解决问题的最佳方法,包括所有运算符,而不仅仅是加法。 (2认同)