有没有办法使用reflection设置结构实例的属性?
我试图写一些代码,在结构上设置一个属性(重要的是它是一个结构上的属性),它是失败的:
System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle(); PropertyInfo propertyInfo = typeof(System.Drawing.Rectangle).GetProperty("Height"); propertyInfo.SetValue(rectangle, 5, null);
高度值(由debugging器报告)永远不会被设置为任何值 – 它保持默认值0。
之前我已经做了大量的关于类的反思,而且这个工作正常。 另外,我知道在处理结构时,如果设置一个字段,则需要使用FieldInfo.SetValueDirect,但是我不知道PropertyInfo的等价物。
rectangle
的值正在被装箱 – 但是那么你正在丢失正在被修改的盒装值。 尝试这个:
Rectangle rectangle = new Rectangle(); PropertyInfo propertyInfo = typeof(Rectangle).GetProperty("Height"); object boxed = rectangle; propertyInfo.SetValue(boxed, 5, null); rectangle = (Rectangle) boxed;
曾经听说过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 } }
除了可以使用的未logging的__makeref
之外,还有其他方法(请参阅System.TypedReference
),但是它们更加痛苦。