So mutieren Sie eine Box-Struktur mithilfe von ILC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 So mutieren Sie eine Box-Struktur mithilfe von IL

Post by Anonymous »

Stellen Sie sich vor, wir haben eine veränderbare Struktur (ja, nicht anfangen):

Code: Select all

public struct MutableStruct
{
public int Foo { get; set; }
public override string ToString()
{
return Foo.ToString();
}
}
Mithilfe von Reflektion können wir eine Box-Instanz dieser Struktur nehmen und sie innerhalb der Box mutieren:

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"
Was ich gerne tun würde, ist, eine IL zu schreiben, die das Gleiche tun kann – aber schneller. Ich bin ein Meta-Programmier-Junkie. ;p

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"

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post