如何检查某个类型是否实现了某个操作符?
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
将执行装箱,反之亦然。