动态确定所需的类

本文关键字:动态 | 更新日期: 2023-09-27 18:09:11

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

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

现在我可以查询设备:

string identifier = dev.QueryIdentifier();

现在我有几个具体的驱动器,例如ConcreteDeviceA, ConcreteDeviceBConcreteDeviceC。每个设备驱动程序都应该有一个ì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或自己查找其构造函数来实例化对象。在这种情况下,必须将返回对象强制转换为基类型。