我想创建一个工厂方法集合,可以实例化各种对象,其类型只在运行时才知道。我可以轻松地为此创建一个委托:
delegate T InstanceCreator<T>()
但这会产生编译错误:“无法解析符号T”
Dictionary<string, InstanceCreator<T>>
所以代替这个我只是声明
Dictionary<string, Delegate>
我试图在Add方法中弥补这种类型特异性的缺乏,但遇到了同样的问题。
public void AddFactory(string typeName, InstanceCreator<T> factory)
有没有更好的方法来确保只有InstanceCreator<T>
个代表被添加到我的收藏中?
答案 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>
也可以正常工作。