Как изменить коробочную структуру с помощью IL

Представьте, что у нас есть изменчивыйstruct (да, неt start):

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

Используя отражение, мы можем взять коробочный экземпляр этогоstruct и мутировать его внутри коробки:

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

Что бы ялайк Для этого нужно написать некоторый IL, который может сделать то же самое, но быстрее. Я'm наркоман метапрограммирования; p

Тривиально распаковать любое значение и изменить его с помощью обычного IL - но вы можетет просто позвоните в коробку потом, потому что это создастразные коробка. яугадывание то, что нам нужно сделать здесь, это скопировать его на существующую коробку. Я исследовал /ldobjstobjно те некажется, не делает работу (если я нем чего-то не хватает).

Итак: существует ли механизм для этого? Или я должен ограничиться рефлексией, чтобы выполнить обновления на месте в штучной упаковкеstructс?

Или другими словами: что?... 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 action = (Action)
    method.CreateDelegate(typeof(Action));
action(obj, 789);
System.Console.WriteLine(obj); // "789"

Ответы на вопрос(5)

Ваш ответ на вопрос