有没有办法使用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 ),但是它们更加痛苦。