c# - 从派生类中的静态方法创建泛型类实例

标签 c# generics static-methods

我在 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’隐式转换为‘Test.DClass’。”

添加以下转换会导致运行时转换异常。

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/

相关文章:

c# - .NET 数据模型显示为 XML 而不是图表

c# - .NET (C#) 中 64 位应用程序的性能优势

java - 方法重载和选择最具体的类型

php - 如何找到调用非静态方法的地方?

c# - 使用调用构造函数的静态方法是否有任何好处(语义或其他)?

c# - 来自 Amazon S3 的 Word 文件的内容类型

c# - 检查列表中的值

generics - 如何在 Rust 中转换泛型原始类型?

c# - 在 C# 中使用泛型以避免代码重复

kotlin - kotlin 泛型中 <out Any?> 和 <*> 的区别