.Net 未定义的对象类型

.Net Undefined Object Type

我的模型中肯定有一个未知类型的属性,因为我需要在我生成模型后根据字符串定义这个class应该是哪个属性我从数据库中检索到的数据。我这样做了,但是我无法访问其中的方法,因为我稍后定义了该对象并且它没有静态类型。这个问题我该怎么办,最有效的解决办法是什么?

我的模型

public class Device
{
    public int DeviceId { get; set; }
    public string deviceJson { get; set; }
    public string DeviceTags { get; set; }
    public string DeviceIndividualTags { get; set; }
    public List<Node> Nodes { get; set; } = null;
    public object Driver { get; set; } = null;

}

我的 ManagerObject

public class ModbusTcpIpClient 
{
    public ModbusTcpIpClient(Device device)
    {

    }
    public void Start() 
    {
        //do somethings
    }
}

我的尝试

foreach (var item in devices)
{
    devices = mysqlManager.GetDevices();
    JObject channelJson = JObject.Parse(item.channelJson);
    switch(channelJson["servermain.MULTIPLE_TYPES_DEVICE_DRIVER"].ToString())
    {
        case "Modbus TCP/IP Ethernet":
            item.Driver = new ModbusTcpIpClient(item);
            break;
    }
}

foreach (var item in devices)
{
    Thread th = new Thread(item.Driver.Start); // in this block i cant go to Start method in the driver
}

这就是关于我朋友的抽象。您应该创建一个接口,例如 IDriver,然后您可以创建多个将从该接口继承的 classes。在接口中,您可以声明继承 class 必须实现的方法。然后,您只需将驱动程序字段类型从 object 更改为 IDriver。老实说,您的问题在一般编程中很常见,您可以查找设计模式 - 它会帮助您相信我。我是一名自动化工程师,我知道你想要达到的目标。当您的设备必须兼容 Profibus 而不是 Modbus 时,您会怎么做? CANopen 和 EtherCAT 怎么样?

请记住让您的界面尽可能小。不要在必须实现仅适用于一种类型对象的方法的地方构建接口。例如,您不想创建 IPrinter,因为还有与扫描仪集成的打印机,如果 IPrinter 必须实现打印和扫描方法,那很糟糕,因为这会强制所有打印机实现扫描方法.相反,您应该创建 IPrinterIScanner 作为单独的接口,即使它们只有一种方法。然后你可以从 classes 中的 IPrinter 继承,代表没有扫描仪的打印机,在有扫描仪的打印机中,你可以简单地从两个接口继承!就这么简单!

Design Patterns 和 SOLID 是您的好朋友,它们会节省您很多时间。

继续加油!我经历了那个,由于我缺乏知识,我以完全相同的方式安装了我的 SCADA。

有什么问题随时问我:)