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

时间:2016-08-28 22:26:02

标签: c# .net generics

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

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

static string getFileName(string url) {
    string[] arr = url.Split('/');
    return arr[arr.Length - 1];
}

上面的代码告诉我public class MyClass<T> { public MyClass<T2>(MyClass<T2> parent = null) { } // ... Additional stuff } 未定义。它不接受它作为方法类型。

一种方法是在我的班级中添加第二种通用​​类型。但这很尴尬,在很多情况下,参数将是T2而且没有类型。

有没有人看到一个简单的方法呢?

2 个答案:

答案 0 :(得分:4)

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

您可以尝试以下方法:

创建较低级别的通用界面

public interface IMyClass {
    //...some common stuff
    IMyClass Parent { get; set; }
}

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

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

答案 1 :(得分:4)

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

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
}

样品使用:

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

仅当您不需要在工厂方法之外访问parent的任何通用成员时,才可以执行此操作。如果你这样做,你最好通过非泛型接口或基类来抽象它。