1

我有几个可以通过通用 API 进行通信的外部设备。

string busIdentifier = "BUS:0:1";
var dev = new CommonDeviceDriver(busIdentifier);

现在我可以查询设备:

string identifier = dev.QueryIdentifier();

现在我有几个具体的驱动程序,例如ConcreteDeviceAConcreteDeviceBConcreteDeviceC。每个设备驱动程序都应该有一个“标识符”。

现在我想为这个先前查询的标识符加载正确的设备驱动程序。

怎么进去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
4

1 回答 1

2

最简单的方法是工厂方法。如果您在编译时知道可用的类型,那么您可以简单地在代码中枚举它们。

public static DriverBase CreateDriver(string identifier, object device) {
    switch (identifier) {
    case IDENTIFIER_A: return new ConcreteDeviceA(device);
    // etc
    }
}

如果您在编译时不知道所有类型(或者您真的反对上述用法),那么您可以使用反射。然后你基本上可以有一个字典映射标识符来输入(就像你在 Python 中一样),并使用Activator.CreateInstance或通过自己查找它的构造函数来实例化对象。在这种情况下,您必须将返回对象强制转换为基本类型。

于 2013-04-14T15:39:05.813 回答