如何使用C#泛型将这3个方法转化为一个方法
本文关键字:方法 一个 泛型 3个 何使用 | 更新日期: 2023-09-27 17:47:25
我很少使用泛型,因此无法确定是否可以将以下三种方法转换为一种使用泛型的方法,以减少重复。事实上,我的代码目前有六个方法,但如果你能解决这三个方法,那么剩下的应该都能用同样的解决方案。
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");
}
}
我正在构建一个简单的表达式解析器,然后需要评估简单的二进制运算,如加法/减法等。我使用上述方法来获得使用相关类型执行的实际数学运算。但必须有一个更好的答案!
Generics本机不支持算术。然而,它可以用.NET3.5来完成,就像这样。Operator类是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可能是个好主意,但欢迎您使用以上内容。
Marc Gravell在使通用数学可行方面做了很多工作。查看杂项以及关于这个问题的一般性文章。
当前版本的MiscUtil中的代码需要.NET 3.5,因为它使用了表达式树。不过,我相信Marc也有一个可以使用.NET2.0的版本。如果这对人们有用,我相信我们可以以某种方式将其合并(可能与MiscUtil本身的facade结合,后者将在运行时使用基于框架版本的适当实现)。
对于未来,我希望看到静态接口,它可以提供一种处理通用数学类型的替代方法。