我有几个外部设备可以通过通用API与之通信。
string busIdentifier = "BUS:0:1";
var dev = new CommonDeviceDriver(busIdentifier);
现在我可以查询设备:
string identifier = dev.QueryIdentifier();
现在我有几个具体的驱动程序,例如ConcreteDeviceA
,ConcreteDeviceB
和ConcreteDeviceC
。每个设备驱动程序都应该有一个“标识符”。
现在我想为之前查询的标识加载正确的设备驱动程序。
如何在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
答案 0 :(得分:2)
最简单的方法是factory method。如果您在编译时知道可用的类型,那么您可以在代码中简单地枚举它们。
public static DriverBase CreateDriver(string identifier, object device) {
switch (identifier) {
case IDENTIFIER_A: return new ConcreteDeviceA(device);
// etc
}
}
如果您在编译时不知道所有类型(或者您真的反对上述用法),那么您可以使用反射。然后你可以基本上有一个字典映射标识符来键入(就像在Python中一样),并使用Activator.CreateInstance
实例化对象,或者自己查找它的构造函数。在这种情况下,您必须将返回对象强制转换为基类型。