我有一个看起来像这样的通用单例:
public class Cache<T>
{
private Dictionary<Guid, T> cachedBlocks;
// Constructors and stuff, to mention this is a singleton
public T GetCache(Guid id)
{
if (!cachedBlocks.ContainsKey(id))
cachedBlocks.Add(id, LoadFromSharePoint(id))
return cachedBlocks[id];
}
public T LoadFromSharePoint(Guid id)
{
return new T(id) // Here is the problem.
}
}
错误信息是:
Cannot create an instance of type T because it does not have the new() constraint.
我必须提到,我必须传递那个id
参数,而且没有其他方法可以这样做。任何有关如何解决此问题的想法都将不胜感激。
最佳答案
通常你会约束类型 T
到具有默认构造函数的类型并调用它。然后你必须添加一个方法或属性才能提供 id
的值。到实例。
public static T LoadFromSharePoint<T>(Guid id)
where T : new() // <-- Constrain to types with a default constructor
{
T value = new T();
value.ID = id;
return value;
}
或者因为您指定您必须提供 id
通过构造函数传递参数,您可以使用反射调用参数化构造函数。 您必须确保该类型定义了您要调用的构造函数。您不能约束泛型类型 T
具有特定构造函数而不是默认构造函数的类型。 (例如 where T : new(Guid)
不起作用。)
例如,我知道有一个构造函数new List<string>(int capacity)
在 List<T>
,可以这样调用:
var type = typeof(List<String>);
object list = Activator.CreateInstance(type, /* capacity */ 20);
当然,您之后可能想进行一些转换(到 T
)。
关于c# - 调用泛型类构造函数的困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15002987/