我没有太多使用泛型,因此无法弄清楚是否可以使用泛型将以下三种方法变成一种方法以减少重复。实际上,我的代码当前有六个方法,但如果您可以解决这三个方法,那么其余的应该可以使用相同的解决方案来工作。
private object EvaluateUInt64(UInt64 x, UInt64 y)
{
switch (Operation)
{
case BinaryOp.Add:
return x + y;
case BinaryOp.Subtract:
return x - y;
case BinaryOp.Multiply:
return x * y;
case BinaryOp.Divide:
return x / y;
case BinaryOp.Remainder:
return x % y;
default:
throw new ApplicationException("error");
}
}
private object EvaluateFloat(float x, float y)
{
switch(Operation)
{
case BinaryOp.Add:
return x + y;
case BinaryOp.Subtract:
return x - y;
case BinaryOp.Multiply:
return x * y;
case BinaryOp.Divide:
return x / y;
case BinaryOp.Remainder:
return x % y;
default:
throw new ApplicationException("error");
}
}
private object EvaluateDouble(double x, double y)
{
switch (Operation)
{
case BinaryOp.Add:
return x + y;
case BinaryOp.Subtract:
return x - y;
case BinaryOp.Multiply:
return x * y;
case BinaryOp.Divide:
return x / y;
case BinaryOp.Remainder:
return x % y;
default:
throw new ApplicationException("error");
}
}
我正在构建一个简单的表达式解析器,然后需要评估简单的二进制运算,例如加法/减法等。我使用上述方法来获取使用相关类型执行的实际数学运算。但必须有一个更好的答案!
泛型本身不支持算术。但是,可以使用 .NET 3.5 来完成,like so http://www.pobox.com/~skeet/csharp/miscutil/usage/genericoperators.html。 Operator 类是以下的一部分MiscUtil http://www.yoda.arachsys.com/csharp/miscutil/。这然后变成:
public T Evaluate<T>(T x, T y) {
switch (Operation)
{
case BinaryOp.Add:
return Operator.Add(x, y);
case BinaryOp.Subtract:
return Operator.Subtract(x, y);
... etc
由于您正在编写表达式解析器,因此直接使用 Expression 可能是一个好主意,但欢迎您使用上面的内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)