C#:从基类静态方法确定派生对象类型

Ste*_*ins 5 c# static-methods derived-class

在C#程序中,我有一个带有静态"Create"方法的抽象基类.Create方法用于创建类的实例并将其存储在本地以供以后使用.由于基类是抽象的,因此实现对象总是从它派生.

我希望能够从基类派生一个对象,通过派生类调用静态Create方法(在基类中实现一次),并创建派生对象的实例.

C#语言中是否有任何设施可以让我解决这个问题.我当前的后备位置是将派生类的实例作为Create函数的参数之一传递,即:

objDerived.Create(new objDerived(), "Arg1", "Arg2");
Run Code Online (Sandbox Code Playgroud)

chi*_*emp 12

尝试使用泛型:

public static BaseClass Create<T>() where T : BaseClass, new()
{
    T newVar = new T();
    // Do something with newVar
    return T;
}
Run Code Online (Sandbox Code Playgroud)

样品用途:

DerivedClass d = BaseClass.Create<DerivedClass>();
Run Code Online (Sandbox Code Playgroud)


Jef*_*tes 5

摘要

有两个主要选择.更好更新的是使用泛型,另一种是使用反射.我提供这两个以防你需要开发一个在.NET 2.0之前工作的解决方案.

泛型

abstract class BaseClass
{
  public static BaseClass Create<T>() where T : BaseClass, new()
  {
    return new T();
  }
}
Run Code Online (Sandbox Code Playgroud)

用法如下:

DerivedClass derivedInstance = BaseClass.Create<DerivedClass>();
Run Code Online (Sandbox Code Playgroud)

反射

abstract class BaseClass
{
  public static BaseClass Create(Type derivedType)
  {
    // Cast will throw at runtime if the created class
    // doesn't derive from BaseClass.
    return (BaseClass)Activator.CreateInstance(derivedType);
  }
}
Run Code Online (Sandbox Code Playgroud)

使用的位置(为了便于阅读,分为两行):

DerivedClass derivedClass
    = (DerivedClass)BaseClass.Create(typeof(DerivedClass));
Run Code Online (Sandbox Code Playgroud)