Как изменить коробочную структуру с помощью 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 - но вы можетет просто позвоните в коробку потом, потому что это создастразные коробка. яугадывание то, что нам нужно сделать здесь, это скопировать его на существующую коробку. Я исследовал /ldobj
stobj
но те некажется, не делает работу (если я нем чего-то не хватает).
Итак: существует ли механизм для этого? Или я должен ограничиться рефлексией, чтобы выполнить обновления на месте в штучной упаковке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"