#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
на класс, он будет работать так, как ожидалось.