具有泛型构造函数的泛型类?

Jon*_*ood 3 .net c# generics

我有一个通用类。构造函数需要接受一个参数,该参数是同一类的另一个实例。问题是另一个实例可以有不同的泛型类型。

看起来 C# 允许我拥有一个具有自己的泛型类型的方法,但是构造函数似乎不允许这样做。

public class MyClass<T>
{
    public MyClass<T2>(MyClass<T2> parent = null)
    {
    }

    // ... Additional stuff
}
Run Code Online (Sandbox Code Playgroud)

上面的代码告诉我T2是未定义的。它不接受它作为方法类型。

一种方法是向我的类添加第二个泛型类型。但这很尴尬,并且在许多情况下,争论将是null并且没有类型。

有没有人看到一个简单的方法来解决这个问题?

Dou*_*las 5

不允许使用通用构造函数。但是,您可以改用通用工厂方法。

public class MyClass<T>
{
    public int Id { get; private set; }
    public int? ParentId { get; private set; }

    public static MyClass<T> Create(int id)
    {
        return Create<object>(id, null);
    }

    public static MyClass<T> Create<T2>(int id, MyClass<T2> parent = null)
    {
        var current = new MyClass<T>();
        current.Id = id;
        current.ParentId = parent?.Id;
        return current;
    }

    private MyClass()
    {
    }

    // ... Additional stuff
}
Run Code Online (Sandbox Code Playgroud)

样品用途:

var intClass = MyClass<int>.Create(55);
var charClass = MyClass<char>.Create(234, intClass);
// charClass.ParentId is 55
Run Code Online (Sandbox Code Playgroud)

仅当您不需要访问parent工厂方法之外的任何通用成员时,这才是可能的。如果这样做,最好通过非通用接口或基类对其进行抽象。


Nko*_*osi 4

你是对的。不支持通用构造函数。

您或许可以尝试以下操作:

创建较低级别的通用接口

public interface IMyClass {
    //...some common stuff
    IMyClass Parent { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并将其用作类型之间的公共链接

public class MyClass<T> : IMyClass {
    public MyClass(IMyClass parent = null) {
        Parent = parent;
    }
    public IMyClass Parent { get; set; }    
    // ... Additional stuff
}
Run Code Online (Sandbox Code Playgroud)