Wie kann ich Wert in Struct-Feld - myStruct.myField
mit Reflektion mit DynamicMethod? Wenn ich setter(myStruct, 111)
aufrufen, wurde der Wert nicht festgelegt, da MyStruct
Werttyp ist. Console.WriteLine(myStruct.myField)
zeigt den Wert 3.
Wie kann man die GetDelegate
Methode ändern, um den Wert in myStruct.myField
einzustellen?C# Reflection - Wie Feld Wert für Struktur festlegen
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);
Deshalb arbeiten wir nicht mit veränderlichen Strukturen. Sie mutieren eine Kopie der Struktur. Erstellen Sie eine neue Version der Struktur mit den initialisierten Feldern zu dem, was sie sein sollen. – Servy
Related [setzen Sie ein Feld von struct] (http://Stackoverflow.com/questions/1272454/generate-dynamic-method-to-set-a-field-of-a-struct-instead-of-using-reflection? rq = 1) Frage * kann * sein, was Sie suchen ... Seitennotiz: freundlich gestellte Frage mit gutem Beispiel ... aber das Ganze, was Sie erreichen wollen, ist sehr verwirrend und funktioniert in den meisten Fällen nicht so, wie Sie es wünschen ... –
Hoppla! Ich erkenne, dass ich meine Antwort vermasselt hatte; bearbeitet - aber es würde viel besser funktionieren als 'ref MyStruct' –