对PropertyGrid控件中PropertyValueChanged事件的探讨

PropertyGrid控件的PropertyValueChanged事件看似很简单,就是属性值被更改时触发该事件。

但是在做一些较复杂的应用时我发现一个问题,如果某个属性项的数据类型为引用类型,比如说是一个自定义的类,那么编译器是如何判断这个项是否更改了呢?

起初,我想当然的认为编译器是用Equals函数来判断的,Equals函数的默认实现仅支持引用相等,但我们在这里显然要求的是值相等,就是说要判断引用类型的实例的各项公有属性的值是否都相等。按照这个思路,我在我的自定义类型里重写了Equals函数。

然而,在后面的调试中我发现编译器还是没有按照我写的Equals函数的实现去判断这个属性项的值是否改变,那么,到底是怎么回事呢?

我把目光投向了PropertyValueChanged事件的具体实现,通过利用Reflector跟踪代码发现,编译器在这一步进行判断时用的是!=,而!=操作符是静态实现的,这样的话,对!=操作符不管怎样重写都没用,因为最终编译器在这一步调用的都是object类型的!=,也就相当于Equals函数的默认实现~~~~~~

到这里,我悲哀的发现,我只有认命了,不知道是不是因为MS的程序员在编写这部分代码时偷了懒还是怎么的,竟然用的是静态的!=而不是可以重写的Equals,也许因为!=比较好写吧,但也就让我等没有了可以扩展的空间……

后记:放弃在自定义类型本身做手脚之后,我转而考虑在PropertyGrid控件上动脑筋,终于找到一个办法,比较笨且无奈,但实用,就是只要发现该属性项的值变了,就重新new一下,哈哈~

转载于:https://www.cnblogs.com/bartholomew/archive/2006/11/03/549176.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值