动态确定所需的类
本文关键字:动态 | 更新日期: 2023-09-27 18:09:11
我有几个外部设备,我可以通过一个通用的API进行通信。
string busIdentifier = "BUS:0:1";
var dev = new CommonDeviceDriver(busIdentifier);
现在我可以查询设备:
string identifier = dev.QueryIdentifier();
现在我有几个具体的驱动器,例如ConcreteDeviceA
, ConcreteDeviceB
和ConcreteDeviceC
。每个设备驱动程序都应该有一个ìdentifier ' .
现在我想为这个之前查询的标识符加载正确的设备驱动程序。
如何解决C#
中的问题?
来自python
,我会这样做:
# Have a dictionary where key is identifier and value is the class
supported_devices = {ConcreteDeviceA.identifer : ConcreteDeviceA,
ConcreteDeviceB.identifer : ConcreteDeviceB,
ConcreteDeviceC.identifer : ConcreteDeviceC}
busIdentifier = "BUS:0:1"
dev = CommonDeviceDriver(busIdentifier)
identifier = dev.QueryIdentifier()
concrete_device = supported_devices[identifier](dev) # Get class and call constructor
最简单的方法是使用工厂方法。如果您在编译时知道可用的类型,那么您可以简单地在代码中枚举它们。
public static DriverBase CreateDriver(string identifier, object device) {
switch (identifier) {
case IDENTIFIER_A: return new ConcreteDeviceA(device);
// etc
}
}
如果您在编译时不知道所有类型(或者您确实反对上述用法),那么您可以使用反射。然后,您就可以拥有一个字典映射标识符到类型(就像在Python中一样),并使用Activator.CreateInstance
或自己查找其构造函数来实例化对象。在这种情况下,必须将返回对象强制转换为基类型。