Как установить поле типа структуры для объекта в Windows Phone 7
У меня возникают проблемы при установке поля для объекта в приложении Windows Phone 7 (я подозреваю, что это связано с компактной средой, а не с Windows Phone 7). Я считаю, что это специфично для установки значений, которые имеют struct
типы. Обычно я использую следующее:
// fieldName is the name of the field I'm interested in setting
FieldInfo fieldInfo = target.GetType().GetField(fieldName);
// target is the object I'm setting the value on
// value is the value that I am setting
fieldInfo.SetValueDirect(__makeref(target), value);
к несчастью SetValueDirect
не существует на Windows Phone 7, а просто с помощью SetValue
не делает ничего для цели. Есть ли альтернативный способ установить struct
поля на WP7 через отражение?
1 ответ
Вы должны будете упаковать структуру, использовать SetValue и распаковать. Не очень элегантно, но еще одна веская причина, по которой структуры должны быть доступны только для чтения. В настоящее время вы, вероятно, пропускаете последний шаг (при использовании неявного блока без захвата блока, ваше изменение в штучной упаковке отбрасывается). Визуально:
MyStruct val = ...
object boxedVal = val;
fieldInfo.SetValue(boxedVal, newValue);
val = (MyStruct)boxedVal;
В целом, метапрограммирование довольно слабо на CF. Если вы делаете это много, есть способы заранее выполнить метапрограммирование с помощью полного.NET, проверяя сборку CF и генерируя сборку CF, которая включает в себя необходимые вам функции. Я успешно использовал IKVM.Reflection для этой цели (встроенное отражение.NET не может этого сделать).