簡體   English   中英

如何創建通用委托實例列表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM