如何检查某个类型是否实现了某个运算符?
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 )
有一种快速但肮脏的方法可以找到答案,它适用于内置类型和自定义类型。它的主要缺点是它依赖于正常流程中的异常,但它可以完成工作。
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
将执行拳击,反之亦然。