Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 通用接口的工厂方法_C# 4.0_Factory Pattern - Fatal编程技术网

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);
}