Jak mutować strukturę pudełkową za pomocą IL

Wyobraź sobie, że mamy zmiennestruct (tak, nie zaczynaj):

public struct MutableStruct
{
    public int Foo { get; set; }
    public override string ToString()
    {
        return Foo.ToString();
    }
}

Korzystając z refleksji, możemy wziąć to w pudełkustruct i zmutuj go w polu:

// 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"

Co bym chciałlubić zrobić to napisać IL, które może zrobić to samo, ale szybciej. Jestem ćpunem metaprogramującym;

Rozdzielenie wartości i zmutowanie wartości za pomocą zwykłej IL jest banalne, ale nie można po prostu wywołać jej, ponieważ spowoduje to utworzenieróżne pudełko. Jestemzgadywanie to, co musielibyśmy tutaj zrobić, to skopiować go do istniejącego pola. Zbadałemldobj / stobj, ale te nie wydają się wykonywać pracy (chyba że czegoś mi brakuje).

Więc: czy istnieje mechanizm, który to umożliwia? Albo muszę ograniczyć się do refleksji, aby wykonać aktualizacje na miejscu w pudełkustructs?

Lub innymi słowy: co... evil goes here... ?

var method = new DynamicMethod("evil", null,
    new[] { typeof(object), typeof(object) });
var il = method.GetILGenerator();
// ... evil goes here...
il.Emit(OpCodes.Ret);

Action<object, object> action = (Action<object, object>)
    method.CreateDelegate(typeof(Action<object, object>));
action(obj, 789);
System.Console.WriteLine(obj); // "789"

questionAnswers(5)

yourAnswerToTheQuestion