我有一個通用函數,它將接口作爲類型獲取,現在在一種情況下,我必須根據接口創建一個新類。我一直在想它,解決這個問題的一種方法是使用IoC,但我希望會有另一種方式,因爲IoC看起來有點像矯枉過正。C# - 根據通用類中提供的接口實例化一個類
下面是使用訪問者模式的嘗試:
public class RepositoryManager<T> : IRepositoryManager<T> where T : class, new()
{
public T GetOrCreate(string id)
{
T item = (T)CreateNew(new T(), id);
return item;
}
}
如果不是的界面我得到了一個對象,然後我可以使用訪問者模式找出實例化什麼類,但我似乎無法根據提供的接口來確定。
我有一個其他的想法是,如果我可以使聲明像一個或?
public class RepositoryManager<T> : IRepositoryManager<T> where T : class, Iabc or Ixyz, new()
我希望這個問題是清楚:)
馬克
感謝您的答覆的。
的問題是,該方法可以有分配給它,例如很多不同的接口:
RepositoryManager類:
private static IMedicament CreateNew(IMedicament emptyType, string id)
{
return new Medicament { Id = id };
}
private static IRefund CreateNew(IRefund emptyType, string id)
{
return new Refund { Id = id };
}
RepositoryManager<Iabc> abcRepository = new RepositoryManager<Iabc>();
RepositoryManager<Ixyz> xyzRepository = new RepositoryManager<Ixyz>();
Iabc abc = abcRepository.GetOrCreate("12345");
Ixyz xyz = xyzRepository.GetOrCreate("12345");
所以使用T item = (T)CreateNew(new T(), id);
不會工作,因爲我必須告訴它是t可以是Iabc或Ixyz類型,但是當我這樣做時,出現以下錯誤:
該調用在以下方法或屬性之間不明確:RepositoryManager<T>.CreateNew(IMedicament, string)
和RepositoryManager<T>.CreateNew(IRefund, string)
這將是很好,如果我得到這個工作,除了複製代碼幾次。
我不明白你的問題是什麼。你想做什麼?編寫一個將接口作爲類型(參數?)並構造一個實現該接口的類的方法? (這將需要註冊表或反射搜索。)或其他東西? – 2008-11-20 00:29:07