Представьте, что у нас есть изменяемый 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
Тривиально распаковать любое значение и изменить значение с помощью обычного IL, но вы не можете просто вызвать box после этого, потому что это создаст другое поле. Я предполагаю, что здесь нам нужно скопировать его поверх существующего поля. Я исследовал 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"
SetValue
в новый метод и передать упакованное значение и при этом изменить значение исходной структуры. Упаковывание, а затем использование отражения, похоже, указывает на то, что сама структура передается по ссылке. Интересный. - person Kirk Woll   schedule 22.09.2013object
— так что оно сразу упаковывается. - person Marc Gravell   schedule 23.09.2013