使用反射对一个结构体成员进行赋值,代码如下:

Type type = s1.GetType();
FieldInfo field = type.GetField("Field1");
field.SetValue(s1, value);

当s1为class类型代码是没问题的,但为struct则代码是无效的。实际上调用field.SetValue方法时,它的第一个参数是引用类型object,而struct是值类型,.NET会对struct进行装箱/拆箱操作。当我们调用field.SetValue的时候,.NET会把s1复制一份装箱作为参数传进去,然后在新的那一份修改值,而原来的则没有改动过。解决方法是使用__makeref构建类型引用对象来设置,代码如下:

FieldInfo field = s1.GetType().GetField("Field1");
TypedReference reference = __makeref(s1);
field.SetValueDirect(reference, value);