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;
}
浙公网安备 33010602011771号