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