您不能使用*
运算符本身,但可以通过生成使用此运算符的表达式来解决它:
static class Operators
{
public static T Multiply<T>(T x, T y)
{
return OperatorCache<T>.Multiply(x, y);
}
static class OperatorCache<T>
{
static OperatorCache()
{
Multiply = MakeBinaryOperator(ExpressionType.Multiply);
}
static Func<T, T, T> MakeBinaryOperator(ExpressionType type)
{
var x = Expression.Parameter(typeof(T), "x");
var y = Expression.Parameter(typeof(T), "y");
var body = Expression.MakeBinary(type, x, y);
var expr = Expression.Lambda<Func<T, T, T>>(body, x, y);
return expr.Compile();
}
public readonly static Func<T, T, T> Multiply;
}
}
然后你可以像这样使用它:
public override T Area()
{
return Operators.Multiply(this.side, this.side);
}
当然你可以在Operators
类中添加其他操作符;请记住,如果您使用的运算符未定义为T
,它将在运行时失败。