永发信息网

C#中怎么监听变量的改变

答案:2  悬赏:50  手机版
解决时间 2021-12-17 03:26
  • 提问者网友:藍色情侶裝
  • 2021-12-16 08:43
例如如下的例子:
Man m = new Man();
m.age = 10;
// 在给age变量赋值的时候要求触发一个事件来调用一个方法

已知的解决方案:
1、在age的set属性内加入一个方法,但是这种做法只适用于单个触发,我想做到的是监听所有变量的改变。

2、赋值前先把Man对象做一个浅复制,然后再比较复制后的Man对象和赋值前的对象有哪些值的变化。
ps:这种做法效率太低,每赋值一次就要把整个类的属性都做一次循环比较。

我想达到的效果就是可以注册一个事件在构造函数里面,然后有值改变的时候就自动触发这个事件。 望高手赐教。
最佳答案
  • 五星知识达人网友:只是一只团子
  • 2021-12-16 09:24
我猜楼主应该是要判断某个字段值是否改变,如果改变则在update里生成这个字段,否则不生成。提高了数据库访问的效率。

其实道理很简单,就是把所有赋值方法封装起来,然后统一调用。就可以很好的解决这个问题。

如果是让我这么做的话,我会先写个基类,然后所有实体类(如Man这个类)继承这个基类。然后再基类里边写公有方法,实体类调用就OK。

Class BaseModel
{

public void SetFunction(ref object obj, object value)

{

obj = value;

//此处可以做任何事

}
}
Class Man : BaseModel
{

private int _age

public int _Age;

{

get{ return _age; }

set{ SetFunction(ref _age, value); }

}
}
当然,你可以在base类里边加个Hashtable,存储之前的变量。用Key直接取值不需要循环,因为里边自带索引了。
全部回答
  • 1楼网友:棉花糖味的小仙女
  • 2021-12-16 10:44
obj.doubleclick += new eventhandler(aa_click(sender,e,i);//这里加入参数就会报错 这里你要注册notifyicon 对象的双击事件, new eventhandler(aa_click); 这里只能传方法名,不能传参数进去。 还有eventhandler只支持两个参数(object sender, eventargs e) 所以 private void aa_click(object sender, eventargs e,int i) { process p = new process(); p.startinfo.filename = @dgvsoft.rows[i].cells[6].value.tostring(); p.startinfo.windowstyle = processwindowstyle.hidden;p.start(); } 这个方法的,int i参数必须去掉。 其实我想到个方法,你不需要传这个参数的 你可以把这个参数保存到notifyicon 对象的tag中 触发 aa_click事件时,你可以从 notifyicon a =(notifyicon )sender; int i = convert.toint32(a.tag); 这样一样可以取到的,有疑问继续问我!
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯