C# 使用泛型进行重构练习

C# 使用泛型进行重构练习,c#,generics,refactoring,C#,Generics,Refactoring,我有一个Quantity(Fowler)类的变体,该类旨在促进单位之间的转换。类型声明为: public class QuantityConvertibleUnits<TFactory> where TFactory : ConvertableUnitFactory, new() { ... } 问题是Quantity类中那些冗长的方法。代码之间唯一的变化是数学运算符(+、-、*,等等),因此似乎应该有一种方法将它们重构为一个通用方法,但我没有看到它 我如何重构代码 干杯

我有一个Quantity(Fowler)类的变体,该类旨在促进单位之间的转换。类型声明为:

public class QuantityConvertibleUnits<TFactory> 
    where TFactory : ConvertableUnitFactory, new() { ... }
问题是Quantity类中那些冗长的方法。代码之间唯一的变化是数学运算符(+、-、*,等等),因此似乎应该有一种方法将它们重构为一个通用方法,但我没有看到它

我如何重构代码

干杯,
Berryl

在C#中没有直接的通用运算符支持。您可以在.NET4上的C#4.0中使用
dynamic
-即

TQuantity newAmount = (dynamic)lhs.Quantity.Amount -
                      (dynamic)equivalentRhs.Quantity.Amount;
或者,您可以在.NET 3.5及更高版本中使用提供了实用程序方法(支持自定义和内置运算符)的:

或者;提供
ICalculator
接口并按类型编写实现。

C#中没有直接的通用运算符支持。您可以在.NET4上的C#4.0中使用
dynamic
-即

TQuantity newAmount = (dynamic)lhs.Quantity.Amount -
                      (dynamic)equivalentRhs.Quantity.Amount;
或者,您可以在.NET 3.5及更高版本中使用提供了实用程序方法(支持自定义和内置运算符)的:

或者;提供一个
ICalculator
接口,并按类型编写实现。

您可以编写一个

 protected static TQuantity _Operator<TQuantity>(TQuantity lhs, TQuantity rhs,
                                       Func<double, double, double> op) 
       where TQuantity : QuantityConvertibleUnits<TFactory>, new()
 {  
        var toUnit = lhs.ConvertableUnit;  
        var equivalentRhs = _Convert<TQuantity>(rhs.Quantity, toUnit);  
        var newAmount = op(lhs.Quantity.Amount,equivalentRhs.Quantity.Amount);  
        return _Convert<TQuantity>(new Quantity(newAmount, toUnit.Unit), toUnit);  
  }  
受保护的静态TQuantity\u运算符(TQuantity lhs、TQuantity rhs、,
(法新社)
其中TQuantity:QuantityConvertibleUnits,new()
{  
var toUnit=lhs.可转换单元;
var当量=换算(rhs.数量,单位);
var newAmount=op(lhs.Quantity.Amount,equivalentRhs.Quantity.Amount);
返回-转换(新数量(新金额、单位)、单位);
}  
并在
\u Add
等中调用此函数。使用
(d1,d2)=>d1+d2
作为附加参数。

您可以编写

 protected static TQuantity _Operator<TQuantity>(TQuantity lhs, TQuantity rhs,
                                       Func<double, double, double> op) 
       where TQuantity : QuantityConvertibleUnits<TFactory>, new()
 {  
        var toUnit = lhs.ConvertableUnit;  
        var equivalentRhs = _Convert<TQuantity>(rhs.Quantity, toUnit);  
        var newAmount = op(lhs.Quantity.Amount,equivalentRhs.Quantity.Amount);  
        return _Convert<TQuantity>(new Quantity(newAmount, toUnit.Unit), toUnit);  
  }  
受保护的静态TQuantity\u运算符(TQuantity lhs、TQuantity rhs、,
(法新社)
其中TQuantity:QuantityConvertibleUnits,new()
{  
var toUnit=lhs.可转换单元;
var当量=换算(rhs.数量,单位);
var newAmount=op(lhs.Quantity.Amount,equivalentRhs.Quantity.Amount);
返回-转换(新数量(新金额、单位)、单位);
}  
并使用
(d1,d2)=>d1+d2
作为附加参数,在您的
\u Add
中调用此函数

 protected static TQuantity _Operator<TQuantity>(TQuantity lhs, TQuantity rhs,
                                       Func<double, double, double> op) 
       where TQuantity : QuantityConvertibleUnits<TFactory>, new()
 {  
        var toUnit = lhs.ConvertableUnit;  
        var equivalentRhs = _Convert<TQuantity>(rhs.Quantity, toUnit);  
        var newAmount = op(lhs.Quantity.Amount,equivalentRhs.Quantity.Amount);  
        return _Convert<TQuantity>(new Quantity(newAmount, toUnit.Unit), toUnit);  
  }