动态确定所需的类

时间:2013-04-14 15:26:39

标签: c# .net

我有几个外部设备可以通过通用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

1 个答案:

答案 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实例化对象,或者自己查找它的构造函数。在这种情况下,您必须将返回对象强制转换为基类型。