C# преобразование родительского объекта в подклассы
Я получил список родительских объектов (устройств) и хотел бы преобразовать каждый объект устройства в объект подкласса. Макет будет выглядеть примерно так:
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 поддерживал все свойства, полученные от класса устройств, а также использовал функциональность Lb100. Я слышал об отражении, но я также слышал, что это очень медленный процесс, и его следует избегать, когда это возможно.
Что было бы идеально, если бы я мог просто пойти:
var device = new Device(){ Firmware = "V1.4"...};
var lb100 = (Lb100) device;
Я также понимаю, что причина понижающего преобразования невозможна, потому что, когда родительский объект создан, он выделяет достаточно памяти для объекта этого типа. Затем, когда вы пытаетесь привести его к большему подклассу, вы пытаетесь вписать этот больший подкласс в выделенное пространство.
Из исследования, которое я собрал, этот способ мышления, когда программирование является неправильным, но никто не упоминает о правильном способе решения этой проблемы. Другие пользователи упоминают, что они создают конструктор, который вручную устанавливает каждое свойство равным друг другу; но это кажется большой проблемой для поддержки кода, особенно когда добавляется больше устройств и моделей. Спасибо за любой совет, который вы можете предоставить!
2 ответа
Вы можете попытаться привести к подклассу, вам нужно только проверить, можно ли его привести.
public class Program
{
public static void Main(string[] args)
{
var smartLightBulb = new SmartLightBulb()
{
DeviceType = "deviceType",
Model = "model"
};
Output(smartLightBulb);
}
public static void Output(Device device)
{
var smartLightBulb = (device as SmartLightBulb);
if(smartLightBulb != null)
{
Console.WriteLine(smartLightBulb.Model);
}
}
}
public class Device
{
public string DeviceType { get; set; }
}
public class SmartLightBulb : Device
{
public string Model { get; set; }
}
Вы можете понижать (от супер до родителя), так как это просто удаление полей. Например, lb100 - это тип устройства.
Но вы не можете повышать (от родителя до супер), поскольку это требует дополнительных данных. Например, устройство не относится к типу lb100.