私は呼び出し元クラスのジェネリック型に基づいて2つのデータメソッドの1つを呼び出す必要があるアプリケーションに取り組んでいます。例えば、Tがタイプfooのであれば、私はdata.GetFoo()を呼び出します:タイプに基づいてDALメソッドを呼び出す
private static List<T> GetObjectList(DateTime mostRecentProcessedReadTime)
{
using (MesReportingDal data = new MesReportingDal())
{
return data.GetFoo(mostRecentProcessedReadTime); // Notice GetFoo()
}
}
を、Tはタイプのバーであれば、私はdata.GetBar()を呼び出します:
private static List<T> GetObjectList(DateTime mostRecentProcessedReadTime)
{
using (MesReportingDal data = new MesReportingDal())
{
return data.GetBar(mostRecentProcessedReadTime); // Notice GetBar()
}
}
これまでは、すべてのタイプが同じ方法で取得されたため、私は1つのDALメソッドしか必要としませんでした。
private static List<T> GetObjectList(DateTime mostRecentProcessedReadTime)
{
using (MesReportingDal data = new MesReportingDal())
{
if (T is Foo) { return data.GetFoo(mostRecentProcessedReadTime); }
if (T is Bar) { return data.GetBar(mostRecentProcessedReadTime); }
}
}
これは、OCPに違反:私は今、私はこのような何かを避けるためにしようとしているT.
の種類に応じて、2つの方法のいずれかを呼び出す必要があります。これを処理するためのエレガントな方法があるので、私はif文を取り除くことができますか?
編集 - これはタイプが
public partial class Foo1 : IDataEntity { }
public partial class Foo2 : IDataEntity { }
public partial class Bar1 : IDataEntity { }
public partial class Bar2 : IDataEntity { }
のように見えるものですこれらのFOOSやバーがLINQのツーSQLで使用DBMLアイテムです。
あなたは 'T'クラスのコントロールを持っていますか?それらは変更できますか?ベースインターフェイス/クラスなどありますか? – NSGaga
私の編集を参照してください。それは役に立ちますか? –
Foo *、Bar *を変更したくない場合、GetFoo、GetBarでなければなりません - ataddeiniが提案したようにGet()はできません。どのようにGetObjectList()を呼び出すつもりですか?あなたは例えばFoo、コール前のバー(たとえば、型付き変数) - またはこれをいくつかの非常に一般的な方法で呼び出す(別の汎用メソッドからTを使用する)あなたができるなら、ataddeiniが言ったことが最も簡単です。 – NSGaga