基于类型返回特定对象的通用工厂方法
本文关键字:对象 方法 工厂 于类型 类型 返回 | 更新日期: 2023-09-27 18:35:25
我有以下基类:
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,但是当然,如果我创建接口,我也需要使其成为通用的,因为返回类型是这样的我怎样才能优雅地处理这种情况?
此设计还有其他选择,但由于我们不知道您要执行的操作的内部结构,因此我的答案将仅基于所呈现的代码。您可以像这样重写 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>();
我认为ItemComponent
应该有一个抽象的SaveItem
函数,然后Cell
和Row
应该实现SaveItem
函数。
ItemComponentSaver<TType>
需要做的就是打电话给item.SaveItem
。完全不需要单独的CellSaver
和RowSaver
课程。
编辑:事实上,除非你在SaveItem
之外做更多的事情,否则我认为根本不需要ItemComponentSaver<TType>
。也许我错过了什么。