我有一个通用类。构造函数需要接受一个参数,该参数是同一个类的另一个实例。问题是另一个实例可能有不同的泛型类型。
看起来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
而且没有类型。
有没有人看到一个简单的方法呢?
答案 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
的任何通用成员时,才可以执行此操作。如果你这样做,你最好通过非泛型接口或基类来抽象它。