[英]How do I create a list of generic delegate instances?
我想創建一個工廠方法的集合,該方法可以實例化各種對象,這些對象的類型只能在運行時知道。 我可以為此輕松創建一個委托:
delegate T InstanceCreator<T>()
但這會導致編譯器錯誤:“無法解析符號T”
Dictionary<string, InstanceCreator<T>>
所以我只想聲明一下
Dictionary<string, Delegate>
我試圖彌補Add方法中類型特殊性的不足,但是遇到了同樣的問題。
public void AddFactory(string typeName, InstanceCreator<T> factory)
有沒有更好的方法來確保僅將InstanceCreator<T>
委托添加到我的集合中?
您可以將AddFactory設為通用方法:
public void AddFactory<T>(string typeName, InstanceCreator<T> factory)
這將限制它僅允許添加InstanceCreator<T>
元素。
public void AddFactory(string typeName,InstanceCreator<T> factory)
T
從哪里來? 您需要使方法本身通用,以使其起作用:
public void AddFactory<T>(string typeName,InstanceCreator<T> factory)
使AddFactory
成為通用方法:
public void AddFactory<T>(string typeName, InstanceCreator<T> factory)
嘗試這樣...
public void AddFactory<T>(string typeName,InstanceCreator<T> factory)
您需要通過類或方法傳遞通用類型參數。
我建議使用標准的Func <TResult>泛型委托:
類的通用類型參數:
public class FactoryRepository<T>
{
IDictionary<string, Func<T>> factoryCache;
public FactoryRepository()
{
this.factoryCache = new Dictionary<string, Func<T>>();
}
public void AddFactory(string key, Func<T> factory)
{
this.factoryCache.Add(key, factory);
}
}
方法通用類型參數:
public void AddFactory<T>(string key, Func<T> factory)
{
// IDictionary<string, Func<T>> factoryCache
factoryCache.Add(key, factory);
}
您在什么范圍內聲明委托。
delegate T InstanceCreator<T>()
如果它在名稱空間級別,則您在那里使用的T與您在方法中使用的T不相同。 在類的范圍內聲明該委托,它應該可以工作。
如果您不需要將typeName
作為字符串,則建議使用Dictionary<Type, Delegate>
並使用如下所示的內容:
Dictionary<Type, Delegate> factories = new Dictionary<Type, Delegate>();
public void AddFactory<T>(InstanceCreator<T> factory)
{
factories.Add(typeof(T), factory);
}
public InstanceCreator<T> GetFactory()
{
return (InstanceCreator<T>)factories[typeof(T)];
}
另外,不需要創建自己的委托類型, Func<T>
也可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.