Как установить значение в поле struct - myStruct.myField
с отражением с помощью DynamicMethod? Когда я вызываю setter(myStruct, 111)
значение не было установлено, потому что MyStruct
- тип значения. Console.WriteLine(myStruct.myField)
показывает значение 3.
Как изменить метод GetDelegate
для установки значения в myStruct.myField
?C# Reflection - Как установить значение поля для struct
public struct MyStruct
{
public int myField;
}
public delegate void SetHandler(object source, object value);
private static SetHandler GetDelegate(Type type, FieldInfo fieldInfo)
{
DynamicMethod dm = new DynamicMethod("setter", typeof(void), new Type[] { typeof(object), typeof(object) }, type, true);
ILGenerator setGenerator = dm.GetILGenerator();
setGenerator.Emit(OpCodes.Ldarg_0);
setGenerator.DeclareLocal(type);
setGenerator.Emit(OpCodes.Unbox_Any, type);
setGenerator.Emit(OpCodes.Stloc_0);
setGenerator.Emit(OpCodes.Ldloca_S, 0);
setGenerator.Emit(OpCodes.Ldarg_1);
setGenerator.Emit(OpCodes.Unbox_Any, fieldInfo.FieldType);
setGenerator.Emit(OpCodes.Stfld, fieldInfo);
setGenerator.Emit(OpCodes.Ldloc, 0);
setGenerator.Emit(OpCodes.Box, type);
setGenerator.Emit(OpCodes.Ret);
return (SetHandler)dm.CreateDelegate(typeof(SetHandler));
}
MyStruct myStruct = new MyStruct();
myStruct.myField = 3;
FieldInfo fi = typeof(MyStruct).GetField("myField", BindingFlags.Public | BindingFlags.Instance);
SetHandler setter = GetDelegate(typeof(MyStruct), fi);
setter(myStruct, 111);
Console.WriteLine(myStruct.myField);
Вот почему мы не работаем с изменяемыми структурами. Вы мутируете копию структуры. Создайте новую версию структуры с полями, инициализированными тем, кем вы хотите. – Servy
[установить поле структуры] (http://stackoverflow.com/questions/1272454/generate-dynamic-method-to-set-a-field-of-a-struct-instead-of-using-reflection? rq = 1) вопрос * может * быть тем, что вы после ... Боковое примечание: приятно заданный вопрос с хорошим образцом ... но целая вещь, которую вы пытаетесь достичь, очень запутанна и вряд ли будет работать так, как вы хотите в большинстве случаев ... –
Oops; Я понимаю, что я набрал свой ответ; отредактированный - однако, он работал бы намного лучше, как «ref MyStruct» –