当前位置: 代码迷 >> C# >> FieldInfo对结构体SetValue无效解决思路
  详细解决方案

FieldInfo对结构体SetValue无效解决思路

热度:83   发布时间:2016-05-05 04:16:49.0
FieldInfo对结构体SetValue无效
struct A
    {
        public int x;
    }

    struct B
    {
        public A a;
    }

    class Program
    {
        static void Main(string[] args)
        {
            B b;
            b.a.x = -2;
            FieldInfo fi = b.GetType().GetField("a");
            Console.WriteLine(b.a.x);

            A a = (A)Activator.CreateInstance(typeof(A));
            FieldInfo fi2 = a.GetType().GetField("x");
            fi2.SetValue(a, 3);
            //a.x = 3;
            Console.WriteLine(fi2.GetValue(a));
            Console.WriteLine(a.x);

            fi.SetValue(b, a);
            Console.WriteLine(b.a.x);
        }
    }


a.x = 3 时,显示  -2, 3, 3, -2;
fi2.SetValue(a,3) 时,显示 -2,0,0,-2;
期望结果:-2,3,3,3

既然GetValue 对结构体有效,为何SetValue对结构体无效呢?

求大神解惑!!!
------解决思路----------------------
FieldInfo.SetValue的原型是:void SetValue(object obj, object value)
当你传递一个值类型(结构是值类型)的时候,它要转化成object,也就是要装箱
而SetValue将作用在那个装箱产品上,而不是原来的那个结构。

解决办法就是自己装箱和拆箱子:

object boxedB = b;        //自己装箱,以便拿到装箱产品
fi.SetValue(boxedB, a);   //
b = (B)boxedB;            //拆箱并拿到被SetValue的结果
Console.WriteLine(b.a.x);