有没有办法使用反射在结构实例上设置属性?

我正在尝试编写一些代码来设置结构的属性(重要的是它是结构的属性),但失败了:


System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle();

PropertyInfo propertyInfo = typeof(System.Drawing.Rectangle).GetProperty("Height");

propertyInfo.SetValue(rectangle, 5, null);

高度值(由调试器报告)永远不会设置为任何值-它保持默认值0。


之前我在课堂上做了很多思考,并且效果很好。另外,我知道在处理结构时


温温酱
浏览 408回答 3
3回答

慕容708150

的值rectangle被装箱-但是您将丢失被修改的装箱值。尝试这个:Rectangle rectangle = new Rectangle();PropertyInfo propertyInfo = typeof(Rectangle).GetProperty("Height");object boxed = rectangle;propertyInfo.SetValue(boxed, 5, null);rectangle = (Rectangle) boxed;

慕姐8265434

听说过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),但它们更痛苦。

德玛西亚99

我有完全一样的问题。@丹·布莱恩特(Dan Bryant)-尽管我同意可变结构是邪恶的,但我这样做的原因是要为不可变结构创建工厂类,并且我需要能够设置只读属性。我正在做与MVC Model Binder子系统类似的事情,尽管简单得多,并且与Web无关。因此,我正在制作不可变的结构,但我只允许自己在创建时对它们进行一次突变,因此,我认为这将避免所有潜在的弊端。
打开App,查看更多内容
随时随地看视频慕课网APP