我可以基于抽象基类中定义的某些属性创建派生类的实例吗?

时间:2019-03-12 15:59:16

标签: c# reflection .net-core asp.net-core-mvc open-closed-principle

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

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()'不起作用,但这是我知道如何解释它的唯一方法。我已经考虑过使用Reflection制作副本或克隆,但是不确定它是否真的可以做我想要的。也许这不可能,但是我想问。

2 个答案:

答案 0 :(得分:1)

怎么样:

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

您还可以使用:

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

另请参阅How do I instantiate a class given its string name?

答案 1 :(得分:0)

创建一个包含其ID相关类型的字典(其值将在您将依赖的string属性中):

Dictionary<string, Type> dictOfTypes = new Dictionary<string, Type>();
dictOfTypes.Add("1", typeof(Class1));

然后根据您拥有的ID,可以从Dictionary获取项目,然后创建实例:

string id = "1";
Type classType = dictOfTypes[id];
var instance = Activator.CreateInstance(classType);