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