为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
温温酱 2019-12-06 10:07:17
我正在尝试编写一些代码来设置结构的属性(重要的是它是结构的属性),但失败了:System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle();PropertyInfo propertyInfo = typeof(System.Drawing.Rectangle).GetProperty("Height");propertyInfo.SetValue(rectangle, 5, null);高度值(由调试器报告)永远不会设置为任何值-它保持默认值0。之前我在课堂上做了很多思考,并且效果很好。另外,我知道在处理结构时
查看完整描述

3 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

的值rectangle被装箱-但是您将丢失被修改的装箱值。尝试这个:


Rectangle rectangle = new Rectangle();

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

object boxed = rectangle;

propertyInfo.SetValue(boxed, 5, null);

rectangle = (Rectangle) boxed;


查看完整回答
反对 回复 2019-12-06
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

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


查看完整回答
反对 回复 2019-12-06
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

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

查看完整回答
反对 回复 2019-12-06
  • 3 回答
  • 0 关注
  • 401 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信