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.

Другие вопросы по тегам