Code: Select all
public struct MutableStruct
{
public int Foo { get; set; }
public override string ToString()
{
return Foo.ToString();
}
}
Code: Select all
// this is basically what we want to emulate
object obj = new MutableStruct { Foo = 123 };
obj.GetType().GetProperty("Foo").SetValue(obj, 456);
System.Console.WriteLine(obj); // "456"
Es ist trivial, den Wert zu entboxen und mit normaler IL zu mutieren – aber Sie können ihn anschließend nicht einfach „boxen“, da dadurch eine andere Box erstellt wird. Ich vermute, dass wir es hier über das vorhandene Feld kopieren müssten. Ich habe ldobj / stobj untersucht, aber diese scheinen nicht zu funktionieren (es sei denn, ich übersehe etwas).
Also: Gibt es einen Mechanismus, um dies zu tun? Oder muss ich mich auf Reflexion beschränken, um direkte Aktualisierungen von Box-Strukturens durchzuführen?
Oder mit anderen Worten: Was ... das Böse passiert hier... ?
Code: Select all
var method = new DynamicMethod("evil", null,
new[] { typeof(object), typeof(object) });
var il = method.GetILGenerator();
// ... evil goes here...
il.Emit(OpCodes.Ret);
Action action = (Action)
method.CreateDelegate(typeof(Action));
action(obj, 789);
System.Console.WriteLine(obj); // "789"
Mobile version