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

DefinaHelper 2010-09-08 11:57:41
例如如下的例子:
Man m = new Man();
m.age = 10; // 在给age变量赋值的时候要求触发一个事件来调用一个方法

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

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


我想达到的效果就是可以注册一个事件在构造函数里面,然后有值改变的时候就自动触发这个事件。 望高手赐教。
问题补充:PS: 如果这种事件的思路有问题的话,其他可以达到同样效果的解决方案也可以,但是不要带来太多的性能损失。
...全文
2528 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
加油馒头 2010-09-09
  • 打赏
  • 举报
回复
个人觉得 1楼 方法简单实用
gomoku 2010-09-08
  • 打赏
  • 举报
回复
如果类能够继承MarshalByRefObject,则可以通过Transparent Proxy来进行调用插入。

public class Man : MarshalByRefObject, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

public string Name {get; set;}
public int Age {get; set;}
...
}

changjiangzhibin 2010-09-08
  • 打赏
  • 举报
回复

//Man m = new Man();
//m.age = 10; // 在给age变量赋值的时候要求触发一个事件来调用一个方法

Class Man
{
bool _gender= false;//默认为男
int _age = 0;//
public int Age
{
get{return _age;}
set
{
MySelfValueChange();
_age = value;
}
}

private void MySelfValueChange()
{
//这里执行关于你要在值改变时需要做的事的代码
}
}

DefinaHelper 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bloodish 的回复:]
不清楚你的C#版本,如果是3.0以后的版本,尝试使用
Dependency Property

2.0以及以前的版本,用方法1可以,但可以做改进

C# code

private String str;
public String StringValue
{
set
{
……
[/Quote]

感谢回复。 这种解决思路和方法一基本上一样,只能用来监听单个属性。 如果属性很多的话就需要重复写大量的代码。
其他这个问题也可以简化一下,就是解决set里面重复代码过多的问题。
bloodish 2010-09-08
  • 打赏
  • 举报
回复
不清楚你的C#版本,如果是3.0以后的版本,尝试使用
Dependency Property

2.0以及以前的版本,用方法1可以,但可以做改进

private String str;
public String StringValue
{
set
{
SetValue("StringValue", ref str, value);
}
}

private int iVal;
public int IntValue
{
set
{
SetValue("IntValue", ref iVal, value);
}
}

private void SetValue<T>(string propName, ref T obj, T value)
{
//最好加上对象是否相等的判断
obj = value;
//执行事件通知
//todo
}
DefinaHelper 2010-09-08
  • 打赏
  • 举报
回复
自己顶一下。。期待高手现身。
threenewbee 2010-09-08
  • 打赏
  • 举报
回复
微软在 Entity Framework 的做法就是类似方法一,但是辅以代码生成器来做。
  • 打赏
  • 举报
回复
首先别纠结于最初级的东西而没完没了,你就能看到无数好的实现方法。例如看看vs自动产生的web service客户端代理的代码,例如看看vs已经支持的code snippet中跟它相关的。
  • 打赏
  • 举报
回复
如果什么都不完美,还能有尽头吗?

INotifyPropertyChanged是基础,也就是说不论你做什么都要兼容它。如果你的系统联兼容它都没有做到,就尽量别奢谈其它。
DefinaHelper 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wuyq11 的回复:]
public class Person : INotifyPropertyChanged
{
private string firstNameValue;
public string FirstName{
get { return firstNameValue; }
set
{
firstNameValue=value;
NotifyPropertyCh……
[/Quote]

这个代码也是写在setter里面的,如果很多属性的话也没办法解决代码重复性的问题
wuyq11 2010-09-08
  • 打赏
  • 举报
回复
public class Person : INotifyPropertyChanged
{
private string firstNameValue;
public string FirstName{
get { return firstNameValue; }
set
{
firstNameValue=value;
NotifyPropertyChanged("FirstName");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
DefinaHelper 2010-09-08
  • 打赏
  • 举报
回复
纠结的蛋疼。。望高手赐教
DefinaHelper 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gomoku 的回复:]
你知道我在讲什么吗?至少你可以先搜索一下Transparent Proxy。

不过我认为每个属性的setter中写事件并不差,用其他复杂的方法可能反而得不偿失。这也是我把有关Transparent Proxy的代码删掉的原因。
[/Quote]

还望指点一下 Transparent Proxy 的相关实现代码。只要能够实现功能,性能方面倒是可以再做优化。
gomoku 2010-09-08
  • 打赏
  • 举报
回复
你知道我在讲什么吗?至少你可以先搜索一下Transparent Proxy。

不过我认为每个属性的setter中写事件并不差,用其他复杂的方法可能反而得不偿失。这也是我把有关Transparent Proxy的代码删掉的原因。
DefinaHelper 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gomoku 的回复:]
如果类能够继承MarshalByRefObject,则可以通过Transparent Proxy来进行调用插入。

C# code

public class Man : MarshalByRefObject, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
……
[/Quote]


貌似不行,继承自 INotifyPropertyChanged 的话,也需要在 set里面写上事件。代码重复量的问题还是不能解决。

111,090

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧