我在 C# 中有一个类,其模板和静态方法类似于
class BClass<T>
{
public static BClass<T> Create()
{
return new BClass<T>();
}
}
由此我派生了一个类并为基类指定了一个模板参数
class DClass : BClass<int> { }
当我尝试使用静态方法创建D的实例时出现问题
class Program
{
static void Main(string[] args)
{
DClass d = DClass.Create();
}
}
给出编译器错误“无法将类型‘Test.BClass
添加以下转换会导致运行时转换异常。
DClass d = (DClass)DClass.Create();
有什么简洁的方法可以让静态方法创建派生类的实例吗?理想情况下,我想要等效于 c++ typedef 的东西,但我不想要下面的语法(它确实有效)。
BClass<int> d = DClass.Create();
最佳答案
看来你要的是DClass
成为 BClass<int>
的别名.但这不是你在这里所拥有的。你拥有的是 DClass
源自 BClass<int>
.因此调用DClass.Create();
创建一个 BClass<int>
, 这不是 DClass
(恰恰相反)。
这可能会使它更清楚。假设你有这个层次结构:
class Rectangle {
static Rectangle Create() {
return new Rectangle();
}
}
class Square : Rectangle { }
// code elsewhere
var shape = Square.Create(); // you might want this to return a square,
// but it's just going to return a rectangle
获得类似您想要的功能的一个选项可能是定义您的 Create
像这样的方法:
static TClass Create<TClass>() where TClass : BClass<T>, new() {
return new TClass();
}
// code elsewhere
var shape = DClass.Create<DClass>();
虽然这有点困惑(并且还要求您为 DClass
编写无参数构造函数)。如果您坚决使用 Create
实例化对象的方法,请考虑为其编写一个工厂类。
关于c# - 从派生类中的静态方法创建泛型类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2920759/