想象一下我们有一个可变的struct
(是的,不要开始):
public struct MutableStruct
{
public int Foo { get; set; }
public override string ToString()
{
return Foo.ToString();
}
}
使用反射,我们可以获取 this 的盒装实例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
,但那些似乎并没有完成这项工作(除非我遗漏了一些东西)。
那么:是否存在这样做的机制?还是我必须将自己限制在反射以执行 boxed s 的就地更新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"