我正在研究一個應用程序,我需要根據調用類的泛型類型調用兩種數據方法之一。例如,如果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()
}
}
在此之前,我只需要一個DAL方法,因爲所有類型都以相同的方式檢索。我現在需要調用兩種方法之一,這取決於我試圖避免類似事情的類型T.
的:
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。有沒有一個優雅的方式來處理這個問題,所以我可以擺脫我的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 2012-04-20 13:54:48
請參閱我的編輯。這有幫助嗎? – 2012-04-20 13:57:26
如果你不想改變Foo *,Bar *並且它必須是GetFoo,GetBar - 不是Get()asaddeini建議的(如果我明白了嗎?)。你打算如何「調用」GetObjectList()?你在定義例如Foo,Bar在通話之前(所以你有例如一個類型化的變量) - 或者你想以某種高度通用的方式調用它(使用另一種通用方法的T)?如果可以的話,最簡單的就是ataddeini所說的。 – NSGaga 2012-04-20 14:19:25