Значение отражения C # для исключения структуры

#c# #reflection #setvalue

#c# #отражение #значение параметра

Вопрос:

У меня есть структура, представляющая собой набор значений, которые я собираю с промышленного контроллера. Что мне нужно, так это просмотреть все поля структуры, обновляя ее значения, но 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 с тем же результатом.

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

Комментарии:

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

2. @jeff-e Почему вы не опубликовали это в качестве ответа? Я изменил структуру на класс, и это сработало!

Ответ №1:

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