如何在C#中使用反射实现字段变更时触发回调?
实现字段值变化时的记录功能
要实现每次Name的值变化时记录该值,直接用公共字段做不到自动监听变化,你需要把字段封装成属性,在属性的set访问器里添加记录逻辑。
修改后的代码如下:
using System; class Data { // 用私有字段存储实际值 private string _name; // 封装成公共属性,添加变化监听 public string Name { get => _name; set { // 当值发生变化时记录 if (_name != value) { Console.WriteLine($"Name字段值已变更:旧值[{_name}] -> 新值[{value}]"); _name = value; } } } public Data(string name) { _name = name; // 初始化时也可以记录一次 Console.WriteLine($"Name字段初始化值:[{_name}]"); } } public class Test { public static void Main() { Data data = new("foo"); // 修改Name值,触发记录 data.Name = "bar"; data.Name = "bar"; // 值未变化,不会触发记录 data.Name = "baz"; // 获取当前值 Console.WriteLine($"当前Name值:{data.Name}"); } }
代码说明
- 把原来的公共字段
Name改成私有字段_name,用公共属性Name对外暴露 - 在属性的
set方法里,先判断新值和旧值是否不同,不同则记录变化信息,再更新私有字段 - 初始化时也可以添加记录,方便追踪初始值
- 如果值没有变化(比如连续设置相同的值),不会重复记录,避免无效日志
运行这段代码会输出:
Name字段初始化值:[foo] Name字段值已变更:旧值[foo] -> 新值[bar] Name字段值已变更:旧值[bar] -> 新值[baz] 当前Name值:baz
内容的提问来源于stack exchange,提问作者kennarddh
相关产品推荐
相关产品推荐

