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;
                }

posted on 2010-06-18 17:53  无法显示此网页  阅读(343)  评论(0编辑  收藏  举报

导航