【发布时间】:2019-03-12 15:59:16
【问题描述】:
基本上我有一个抽象类,我们会说两个属性,一个是抽象类,一个是派生类。
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()”不起作用,但这是我知道如何解释它的唯一方法。我已经研究过使用反射制作副本或克隆,但不确定它是否真的会做我想要的。这可能不太可能,但我想我会问的。
【问题讨论】:
-
使用factory method pattern 的变体。创建一个静态方法(在 BaseClass 中或在用作工厂的单独类中),其目的是根据传递给静态方法的某些参数创建并返回具体类型的实例...
-
谢谢,这就是我要找的东西,而不是在我创建类的任何地方都有逻辑,只需将它放在一个地方。然而,实现是让我绊倒的地方,如果将来要添加新的派生类,我不想更新工厂。
标签: c# reflection .net-core asp.net-core-mvc open-closed-principle