使用C#泛型作为构造函数名称的语法是什么?

Edw*_*uay 0 c# generics inheritance

我有很多继承自的课程Item<T>.

每个类都有一个我想要进入的Create()方法Item<T>.

然而,以下代码获取错误" 无法创建变量类型'T'的实例,因为它没有new()约束 ":

T item = new T(loadCode);
Run Code Online (Sandbox Code Playgroud)

执行此操作的更正语法是什么?

public abstract class Item<T> : ItemBase
{

    public static T Create(string loadCode)
    {
        T item = new T(loadCode);

        if (!item.IsEmpty())
        {
            return item;
        }
        else
        {
            throw new CannotInstantiateException();
        }
    }
Run Code Online (Sandbox Code Playgroud)

Meh*_*ari 9

这是不可能的.您只能使用new()约束来强制存在构造函数.

解决方法是将Func<InputType, T>(Func<string,T>在您的示例中)委托作为输入参数,为我们创建对象.

public static T Create(string loadCode, Func<string,T> construct)
{
    T item = construct(loadCode);

    if (!item.IsEmpty())
    {
        return item;
    }
    else
    {
        throw new CannotInstantiateException();
    }
}
Run Code Online (Sandbox Code Playgroud)

并称之为: Item<T>.Create("test", s => new T(s));