Reflection: SetValue() for a value type
遇到一个比较特殊的情况, 有一个对象, 里面有十几个成员, 由于不需要后期更改, 于是定义成readonly, 这就要求在构造函数里完成。 代码如下:
public class TestInfo { public TestInfo(string par) { DeviceClass = ""; InstallDate = ""; foreach (FieldInfo item in this.GetType().GetFields()) { object val = "a"; if (val != null) { item.SetValue(tmp, val); } } } public readonly string DeviceClass; public readonly string InstallDate; }
当对象做为一个引用的class时候没有任何问题。 但是由于一些其他需求, 将这个对象改为值类型更合适, 然后改完就有以下2个问题:
1。 this 需要完全赋值才能使用, 所以如果成员变量有20个, 也要全部先赋值, 然后修改属性
2。 反射的时候, 由于对象是值类型, FieldInfo.SetValue(this, value)的时候会赋值不成功。 解决方法是, 将对象this装箱为引用类型, 反射修改以后, 再拆箱成值类型。SetValue() 的部分要修改如下:
if (val != null) { object tmp = this; item.SetValue(tmp, val); this = (TestInfo)tmp; }