c# - 调用泛型类构造函数的困境

标签 c# constructor initialization generics

我有一个看起来像这样的通用单例:

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/

相关文章:

c# - 使调整大小与窗口的某些宽度对齐

java - 多线程私有(private)构造函数

C++: "error C4430: missing type specifier - int assumed"对于构造函数和析构函数的无效声明

c - GValue 初始化/终结的必要性

java - 如何获取 SunAwtFrame 窗口处理程序

c# - 从文本框名称创建表格时语法不正确

javascript - 需要一个 JavaScript 函数来识别单击“保存”按钮时使用的文本框

c++ - 拷贝构造函数和赋值运算符的区别

generics - 如何在 Rust 中初始化一个泛型变量

java - 创建用户定义的数据类型会出现问题