如何创建通用委托实例列表?

时间:2011-11-15 22:14:22

标签: c# delegates

我想创建一个工厂方法集合,可以实例化各种对象,其类型只在运行时才知道。我可以轻松地为此创建一个委托:

delegate T InstanceCreator<T>()

但这会产生编译错误:“无法解析符号T”

Dictionary<string, InstanceCreator<T>> 

所以代替这个我只是声明

Dictionary<string, Delegate>

我试图在Add方法中弥补这种类型特异性的缺乏,但遇到了同样的问题。

public void AddFactory(string typeName, InstanceCreator<T> factory)

有没有更好的方法来确保只有InstanceCreator<T>个代表被添加到我的收藏中?

7 个答案:

答案 0 :(得分:1)

您可以将AddFactory设为通用方法:

public void AddFactory<T>(string typeName, InstanceCreator<T> factory)

这会将其限制为仅允许添加InstanceCreator<T>个元素。

答案 1 :(得分:1)

public void AddFactory(string typeName,InstanceCreator<T> factory)

T来自哪里?您需要使方法本身通用才能使其正常工作:

public void AddFactory<T>(string typeName,InstanceCreator<T> factory)

答案 2 :(得分:0)

使AddFactory成为通用方法:

public void AddFactory<T>(string typeName, InstanceCreator<T> factory) 

答案 3 :(得分:0)

尝试这样....

public void AddFactory<T>(string typeName,InstanceCreator<T> factory) 

答案 4 :(得分:0)

您需要通过类或方法传递泛型类型参数。

我建议使用标准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);
}

答案 5 :(得分:0)

你在什么范围宣布代表。

delegate T InstanceCreator<T>()

如果它在命名空间级别你正在起诉的那个T和你在你的方法中使用的T是不一样的。在类的范围内声明委托,它应该可以工作。

答案 6 :(得分:0)

如果您不需要将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>也可以正常工作。