Представьте, что мы имеем mutable struct
(да, не начинайте):
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, который может сделать то же самое, что и это, но быстрее. Я мета-программирующий наркоман, p
Тривиально для unbox-any значение и мутировать значение с помощью обычного 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<object, object> action = (Action<object, object>)
method.CreateDelegate(typeof(Action<object, object>));
action(obj, 789);
System.Console.WriteLine(obj); // "789"