我有一个通用类。构造函数需要接受一个参数,该参数是同一类的另一个实例。问题是另一个实例可以有不同的泛型类型。
看起来 C# 允许我拥有一个具有自己的泛型类型的方法,但是构造函数似乎不允许这样做。
public class MyClass<T>
{
public MyClass<T2>(MyClass<T2> parent = null)
{
}
// ... Additional stuff
}
Run Code Online (Sandbox Code Playgroud)
上面的代码告诉我T2是未定义的。它不接受它作为方法类型。
一种方法是向我的类添加第二个泛型类型。但这很尴尬,并且在许多情况下,争论将是null并且没有类型。
有没有人看到一个简单的方法来解决这个问题?
不允许使用通用构造函数。但是,您可以改用通用工厂方法。
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工厂方法之外的任何通用成员时,这才是可能的。如果这样做,最好通过非通用接口或基类对其进行抽象。
你是对的。不支持通用构造函数。
您或许可以尝试以下操作:
创建较低级别的通用接口
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)