C# 4.0 通用接口的工厂方法
我认为这段代码受到了致命的伤害,但在我采取新方法之前,我想听听一些意见 我正在为以下接口编写一个工厂方法C# 4.0 通用接口的工厂方法,c#-4.0,factory-pattern,C# 4.0,Factory Pattern,我认为这段代码受到了致命的伤害,但在我采取新方法之前,我想听听一些意见 我正在为以下接口编写一个工厂方法 public interface ITransformer<I, O> { O Transform(I input); } 我也考虑了第一个选项,但是调用带有反射的工厂方法,这样我就可以动态地分配类型变量 最终,我希望整个“转换”过程包含在一个可重用的方法中,并在需要时实现新的转换器,但我还没有实现。 对于这种情况,有更好或更安全的方法吗 感谢阅读。如果您对探索OOP和模
public interface ITransformer<I, O>
{
O Transform(I input);
}
我也考虑了第一个选项,但是调用带有反射的工厂方法,这样我就可以动态地分配类型变量
最终,我希望整个“转换”过程包含在一个可重用的方法中,并在需要时实现新的转换器,但我还没有实现。对于这种情况,有更好或更安全的方法吗
感谢阅读。如果您对探索OOP和模式感兴趣,那么这就偏离了主题,但是您正在描述的这个特定示例可以使用
Func
委托相当简洁地描述
e、 g
您可以将select
定义为I
e、 g
publicstatico选择(此I输入,Func项目)
{
返回项目(输入);
}
只是一个想法
编辑
刚刚测试过,应该可以正常工作:)
将
transform
重命名为select
,以突出显示与Linq操作符的相似性。这类问题最好通过像Ninject这样的依赖项注入库来解决。这些库允许您轻松地将具体实现绑定到接口,然后您的工厂可以轻松地在执行时获得正确的实现。我喜欢这个想法。我要试一试。
public class CarToTruckTransformer : ITransformer<Car, Truck>
{
public Truck Transform(Car input)
{
Truck output = new Truck();
output.Seats = input.Seats - 2;
output.BedSize = input.TrunkSize;
output.Gunrack = true;
return output;
}
}
static class TransformerFactory
{
public static ITransformer<I, O> GetTransformer<I, O>()
{
if (typeof(I) == typeof(Car) && typeof(O) == typeof(Truck))
{
return (ITransformer<I, O>)new CarToTruckTransformer();
}
else
{
return null;
}
}
}
ITransformer<Car, Truck> transf = TransformerFactory.GetTransformer<Car, Truck>();
public class TransformerFactory2
{
public static dynamic GetTransformer(VehicleBase input, VehicleBase output)
{
if (input.GetType() == typeof(Car) && output.GetType() == typeof(Truck))
{
return (ITransformer<Car, Truck>)new CarToTruckTransformer();
}
else
{
return null;
}
}
}
dynamic transf = TransformerFactory2.GetTransformer(car, truck);
var car = getSomeCar();
car.select(c => new Truck{
:
:
});
public static O select<I,O>(this I input, Func<I,O> project)
{
return project(input);
}