有这样一个结构:
要求生成一个Demo的实例,并使之Val属性返回5。
对于一个初学者而言,这是不可能的,因为Val属性是只读的,而其封装的字段又是私有的!
我最初的想法是,反射不就完了吗,于是有如下代码:
运行后,你就能发现:Val属性返回的是0。
为什么会出现这样的问题呢?
请注意这里:
void SetValue(object obj,object value);
很明显,该方法对de进行了装箱,所以它设置的是装箱后副本的值,而不是原来的de。
既然如此,我们把装箱值拆出来即可:
当然,这个问题不能说是微软没设计好,实际上根本无法解决:
因为值类型的公共基类是System.ValueType,而这个类本身就是引用类型,所以装箱是必然的。
另外,如果你对内存布局有所理解的话,还可以直接在内存中修改。
这里其实还是比较简单的,因为只有一个实例字段,不会涉及到字段排序及对齐的问题。
代码如下:
如果使用不安全代码将更加简洁: