C# 基于类型返回特定对象的泛型工厂方法

C# 基于类型返回特定对象的泛型工厂方法,c#,oop,generics,switch-statement,factory-pattern,C#,Oop,Generics,Switch Statement,Factory Pattern,我有以下基类: public abstract class ItemComponentSaver<TType> : where TType : ItemComponent { public abstract bool SaveItem(TType item, object objectRowInTableFromEF, PropertyInfo columnTypeProperty); } public抽象类ItemComponentSaver:其中TType:ItemCo

我有以下基类:

public abstract class ItemComponentSaver<TType> : where TType : ItemComponent
{
    public abstract bool SaveItem(TType item, object objectRowInTableFromEF, PropertyInfo columnTypeProperty);
}
public抽象类ItemComponentSaver:其中TType:ItemComponent
{
公共抽象bool SaveItem(TType项,对象对象RowIntableFromEF,PropertyInfo columnTypeProperty);
}
对于我支持的每种类型,这一个也有一些子级。例如,我的想法是以多态方式使用它们来稍后执行保存操作

    public class CellSaver : ItemComponentSaver<Cell>
    {
        public override bool SaveItem(Cell item, object objectRowInTableFromEF, PropertyInfo columnTypeProperty)
        {
                // code here
        }
    }
公共类CellSaver:ItemComponentSaver
{
public override bool SaveItem(单元格项、对象对象RowIntableFromEF、属性InInfo columnTypeProperty)
{
//代码在这里
}
}
现在,我知道在某个时候我需要创造这些东西,所以有一个不可避免的“开关”式的说法,我为此建立了一个工厂:

public static class ItemComponentSaverFactory
{
    public static ItemComponentSaver<T> GetSaver<T>(ItemComponent entity) where T : ItemComponent
    {
        if (entity is Cell)
            return (ItemComponentSaver<T>)new CellSaver();

        if (entity is Row)
            return (ItemComponentSaver<T>)new RowSaver();
    }

}
公共静态类ItemComponentSaverFactory
{
公共静态ItemComponentSaver GetSaver(ItemComponent实体),其中T:ItemComponent
{
if(实体为单元格)
返回(ItemComponentSaver)新的CellSaver();
如果(实体为行)
返回(ItemComponentSaver)新的行保护程序();
}
}
问题是,我不能将CellSaver强制转换为返回类型,因为它是通用的。我也可以返回一个接口,而不是类tpe,但是当然,如果我创建接口,我也需要将其设置为泛型,因为返回类型是这样的
我怎样才能优雅地处理这个问题呢?

我认为
ItemComponent
应该有一个抽象的
SaveItem
函数,然后
Cell
Row
应该实现
SaveItem
函数

所有
ItemComponentSaver
需要做的就是调用
item.SaveItem
。根本不需要单独的
CellSaver
RowSaver


编辑:事实上,除非你在
SaveItem
之外做更多的事情,否则我认为根本不需要
ItemComponentSaver
。也许我遗漏了一些东西。

此设计还有其他选择,但由于我们不知道您尝试执行的操作的内部内容,因此我的答案将仅基于提供的代码。 您可以像这样重写GetSaver方法:

     public static ItemComponentSaver<T> GetSaver<T>() where T : ItemComponent
     {
         if (typeof(T) == typeof(Cell))
             return new CellSaver() as ItemComponentSaver<T>;
         else if (typeof(T) == typeof(Row))
             return new RowSaver() as ItemComponentSaver<T>;
         else
             return null;//here you can return what u need in case no types match.
     }
公共静态ItemComponentSaver GetSaver(),其中T:ItemComponent
{
if(类型(T)=类型(单元))
将新的CellSaver()作为ItemComponentSaver返回;
如果(类型(T)=类型(行))
将新的RowSaver()作为ItemComponentSaver返回;
其他的
return null;//如果没有匹配的类型,您可以在这里返回所需的内容。
}
像这样打电话

ItemComponentSaver<Row> saver = ItemComponentSaverFactory.GetSaver<Row>();
ItemComponentSaver=ItemComponentSaverFactory.GetSaver();

嗨,特里,谢谢你的回答,我不知道我怎么没试过。顺便说一句,我想知道其他哪些好的设计选项是好的,至少从“哲学”的角度来看,它们可能会适应我当前的代码,学习Hanks David总是好的,这是我最初的方法,但是,因为整个保存过程最终使用了一些DAL类,我无法直接从域模型(单元格、行)访问它们,这就是为什么我选择了“saver类”方法,它最终将成为用于此目的的合作者。