c# - 我可以根据抽象基类中定义的某个属性创建派生类的实例吗?
问题描述
基本上我有一个抽象类,我们会说两个属性,一个是抽象类,一个是派生类。
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()”不起作用,但这是我知道如何解释它的唯一方法。我已经研究过使用反射制作副本或克隆,但不确定它是否真的会做我想要的。这可能是不可能的,但我想我会问。
解决方案
怎么样:
switch(id) {
case "1": list.Add(new Class1());
break;
...
}
您还可以使用:
list.Add((BaseClass)Activator.CreateInstance("AssemblyName", "Class"+id));
推荐阅读
- c# - Unity3D,Android Apk 在 Application.persistantDatapath 中看不到文件
- php - 在子目录上安装 Laravel。整个应用程序必须是公开的
- javascript - Firebase 函数如何在循环完成迭代后发送
- django - 在 django 中将时间戳转换为日期时间将默认将日期时间转换为 UTC 中的日期时间
- html - 为什么这个元素认为它被悬停?
- node.js - 在 TypeScript 中使用本机 JS 方法/调用的正确方法是什么
- javascript - 将滚动应用于特定 DIV
- apollo - Apollo 中的 client.query 和 useQuery 有什么区别?
- tags - 如何向 Svelte/Sapper 降价网站添加类别或标签?
- node.js - 是否可以将 node.js 控制台配置为在浏览器中可见