1

我有以下基类:

public abstract class ItemComponentSaver<TType> : where TType : ItemComponent
{
    public abstract bool SaveItem(TType item, object objectRowInTableFromEF, PropertyInfo columnTypeProperty);
}

对于我支持的每种类型,这个也有一些孩子。我的想法是在以后多态地使用它们来执行保存操作,例如

    public class CellSaver : ItemComponentSaver<Cell>
    {
        public override bool SaveItem(Cell item, object objectRowInTableFromEF, PropertyInfo columnTypeProperty)
        {
                // code here
        }
    }

现在,我知道在某些时候我需要创建这些东西,所以有不可避免的“开关”之类的声明,我为此创建了一个工厂:

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

}

问题是,我不能将 CellSaver 转换为返回类型,因为它是通用的。我也可以返回一个接口而不是类 tpe,但是当然,如​​果我创建接口,我也需要将其设为泛型,因为返回类型是这样的我怎样才能以优雅的方式处理这种情况?

4

2 回答 2

2

此设计还有其他选择,但由于我们不知道您尝试执行的操作的内部结构,因此我的回答将仅基于提供的代码。您可以像这样重写您的 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<Row> saver = ItemComponentSaverFactory.GetSaver<Row>();
于 2013-10-15T23:50:19.937 回答
1

我觉得ItemComponent应该有一个抽象SaveItem函数,然后CellRow应该实现这个SaveItem函数。

所有ItemComponentSaver<TType>需要做的就是调用item.SaveItem. 根本不需要个人CellSaverRowSaver班级。

编辑:事实上,除非你在外面做更多的事情,否则SaveItem我认为根本不需要 an ItemComponentSaver<TType>。也许我错过了一些东西。

于 2013-10-15T22:16:12.440 回答