私は次の基本クラスを持っています:
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の代わりにインターフェイスを返すこともできますが、もちろん、インターフェイスを作成する場合は、戻り値の型がそのようなものであるため、それをジェネリックにする必要があります。