首页 > 解决方案 > 我可以根据抽象基类中定义的某个属性创建派生类的实例吗?

问题描述

基本上我有一个抽象类,我们会说两个属性,一个是抽象类,一个是派生类。

public abstract class BaseClass { 
    public string ID { get; set; } 
    public abstract string Name { get; };
}

public class Class1 : BaseClass { // id would be 1
    public string Name { get { return "Class1 Name"; }
}

public class Class2 : BaseClass {
    public string Name { get { return "Class2 Name"; }
}

public class Class3 : BaseClass {
    public string Name { get { return "Class3 Name"; }
}

然后我的数据层中有一个方法,它基本上返回基类的 ID 列表。我要问的是,如果没有 if 或 switch 语句,我是否可以根据这些 ID 创建 DerivedClass 的新实例?所以...

List<BaseClass> list = new List<BaseClass>();
string id = dataReader["ID"].ToString(); // say this id = 1
list.Add(new BaseClass { ID = id }); // this would be "Class1 Name" and the Class would be Class1

我知道我无法创建抽象类的新实例,因此“new BaseClass()”不起作用,但这是我知道如何解释它的唯一方法。我已经研究过使用反射制作副本或克隆,但不确定它是否真的会做我想要的。这可能是不可能的,但我想我会问。

标签: c#reflection.net-coreasp.net-core-mvcopen-closed-principle

解决方案


怎么样:

switch(id) {
   case "1": list.Add(new Class1());
   break;
   ...
}

您还可以使用:

list.Add((BaseClass)Activator.CreateInstance("AssemblyName", "Class"+id));

另请参阅如何在给定字符串名称的情况下实例化一个类?


推荐阅读