如何检查某种类型是否实现某个运算符?
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 )
答案 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;
}
}