C#向下转换父对象到子类

时间:2018-06-14 21:00:15

标签: c# casting type-conversion downcast

我收到父对象(设备)列表,并希望将每个设备对象转换为子类Object。布局看起来像是:

public class Device
{
    public string FimrwareVersion { get; set; }

    public string DeviceName { get; set; }

    public int Status { get; set; }

    public string Alias { get; set; }

    public string DeviceType { get; set; }

    public string AppServerUrl { get; set; }

    ...
}

public class SmartLightBulb : Device
{
    public string Model { get; set; }

    public string Description { get; set; }

    public string SoftwareVersion { get; set; }

    public int State { get; set; }

    // Turn On/Off
    public async Task ToggleState()
    {
        // Toggle State
    }

    ...
}


public class SmartPlug : Device
{
    public string Model { get; set; }

    public string Description { get; set; }

    public string SoftwareVersion { get; set; }

    public int State { get; set; }

    // stay on for X
    public async Task SetTimer()
    {
        // Set Timer
    }

    ...
}

public class Lb100 : SmartLightBulb 
{

    public async Task ChangeBrightness(int brightness)
    {
        // Change Brightness
    }
}

public class Lb200 : SmartLightBulb 
{

    public async Task ChangeBrightness(int brightness)
    {
        // Change Brightness
    }

    public async Task ChangeColor()
    {
        // Change Color
    }
}

问题是我收到了一个设备列表,我无法从设备转发到Lb100。我希望Lb100能够维护从Device Class接收的所有属性,并且还具有Lb100的功能。我听说过反思,但我也听说这是一个非常缓慢的过程,应尽可能避免。

如果我可以去,那将是完美的:

var device = new Device(){ Firmware = "V1.4"...};
var lb100 = (Lb100) device;

我也明白,向下转换是不可能的原因是因为在创建父对象时,它为该类型的对象分配了足够的内存。然后,当您尝试将其转换为更大的子类时,您试图将更大的子类拟合到该分配的空间中。

从我收集的研究中,这种思维方式在编程时是不正确的,但没有人真正提到正确的思考方式。其他用户提到他们创建了一个构造函数,手动设置每个属性彼此相等;但这似乎是维护代码的一个主要麻烦,特别是在添加更多设备和模型时。感谢您提供的任何建议!!

2 个答案:

答案 0 :(得分:0)

你可以尝试转换为子类,你只需要验证它是否可以被转换。

{{1}}

答案 1 :(得分:-1)

你可以向下(从超级到父级),因为它只是删除字段。 例如。 lb100是一种设备。

但是你无法进行演员(从父级到超级级),因为这需要额外的数据。 例如。设备不是lb100的类型。