我收到父对象(设备)列表,并希望将每个设备对象转换为子类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;
我也明白,向下转换是不可能的原因是因为在创建父对象时,它为该类型的对象分配了足够的内存。然后,当您尝试将其转换为更大的子类时,您试图将更大的子类拟合到该分配的空间中。
从我收集的研究中,这种思维方式在编程时是不正确的,但没有人真正提到正确的思考方式。其他用户提到他们创建了一个构造函数,手动设置每个属性彼此相等;但这似乎是维护代码的一个主要麻烦,特别是在添加更多设备和模型时。感谢您提供的任何建议!!
答案 0 :(得分:0)
你可以尝试转换为子类,你只需要验证它是否可以被转换。
{{1}}
答案 1 :(得分:-1)
你可以向下(从超级到父级),因为它只是删除字段。 例如。 lb100是一种设备。
但是你无法进行演员(从父级到超级级),因为这需要额外的数据。 例如。设备不是lb100的类型。