C# Reflection SetValue для исключения структуры

У меня есть структура, представляющая собой набор значений, которые я собираю с промышленного контроллера. Мне нужно пройти через все поля структуры, обновив ее значения, но SetValue выдает исключение

Объект не соответствует типу цели

public struct MyStruct
{
    public bool PLC_Manual_0_0 {get; set;}
    public bool PLC_Auto_0_1 {get; set; }
    public char PLC_KNR_9_14_0 {get; set;}
    public char PLC_KNR_10_15_0 {get; set;}
    public byte Reserva_16_0 {get; set;}
    public byte Reserva_17_0 {get; set;}
    public int Reserva_32_0 {get; set;}
    public int Reserva_34_0 {get; set;}
    public double Reserva_36_0 {get; set;}
    ...
}

public void ReadData()
{
    MyStruct mystruct = new MyStruct();
    Type mystruct_type = mystruct.GetType();
    PropertyInfo[] mystruct_properties = mystruct_type.GetProperties();
    foreach (PropertyInfo mystruct_property in mystruct_properties)
    {
        switch (mystruct_property.PropertyType.Name)
        {
            case "Boolean":
                bool bool_data = true;
                mystruct_property.SetValue(mystruct_property, bool_data);
                break;                             
            case "Byte":
                byte byte_data = 1;
                mystruct_property.SetValue(mystruct_property, byte_data);
                break;
            case "Char":
                char char_data = '1';
                mystruct_property.SetValue(mystruct_property, char_data);
                break;
            default:
                break;
        }
}

Я также попробовал SetValue, используя mystruct_type вместо mystruct_property с тем же результатом.

Что я делаю не так?


person Felipe    schedule 27.08.2020    source источник
comment
Первым параметром для SetValue должен быть экземпляр, свойство которого вы хотите установить, но вместо этого вы передали информацию о свойстве. Но в любом случае это безнадежно, потому что MyStruct — это тип значения; SetValue повлияет только на копию значения, которое вы ему передадите, а не на исходное значение. Эта структура, вероятно, должна быть классом.   -  person Jeff    schedule 27.08.2020
comment
@ jeff-e Почему ты не опубликовал это как ответ? Я изменил структуру на класс, и это сработало!   -  person Felipe    schedule 27.08.2020


Ответы (1)


Первым параметром для SetValue должен быть экземпляр, свойство которого вы хотите установить, но вместо этого вы передали информацию о свойстве. Но в любом случае это безнадежно, потому что MyStruct — это тип значения; SetValue повлияет только на копию значения, которое вы ему передадите, а не на исходное значение. Если вы исправите параметр SetValue и измените MyStruct на класс, он будет работать как положено.

person Jeff    schedule 27.08.2020