我正在尝试编写一些在结构上设置属性的代码(重要的是它是结构上的属性)并且它失败了:
System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle();
PropertyInfo propertyInfo = typeof(System.Drawing.Rectangle).GetProperty("Height");
propertyInfo.SetValue(rectangle, 5, null);
高度值(由调试器报告)永远不会设置为任何值 - 它保持默认值0。
我之前已经对课程进行了大量的反思,这种方法运行良好。另外,我知道在处理结构时,如果设置字段,则需要使用FieldInfo.SetValueDirect,但我不知道PropertyInfo的等价物。
答案 0 :(得分:64)
rectangle
的值被装箱 - 但是你丢失了盒装值,这就是被修改的值。试试这个:
Rectangle rectangle = new Rectangle();
PropertyInfo propertyInfo = typeof(Rectangle).GetProperty("Height");
object boxed = rectangle;
propertyInfo.SetValue(boxed, 5, null);
rectangle = (Rectangle) boxed;
答案 1 :(得分:14)
有没有听说过SetValueDirect
?这是他们成功的原因。 :)
struct MyStruct { public int Field; }
static class Program
{
static void Main()
{
var s = new MyStruct();
s.GetType().GetField("Field").SetValueDirect(__makeref(s), 5);
System.Console.WriteLine(s.Field); //Prints 5
}
}
除了你可以使用的无证__makeref
之外还有其他方法(见System.TypedReference
),但它们更痛苦。