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

问题描述 投票:0回答:4

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

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 )
c# reflection operators
4个回答
7
投票

您应该检查类是否有名称为

op_Addition
的方法 您可以在here

找到重载方法名称

希望这有帮助


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

4
投票

一个名为

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”的普通方法;


0
投票

您可以使用

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
将执行拳击,反之亦然。

© www.soinside.com 2019 - 2024. All rights reserved.