如何在c#中使用反射改变字段时触发回调



例如,我想记录每次Name值变化时的日志。

using System;
class Data {
public string Name;

public Data(string name) {
Name = name;
}
}
public class Test
{
public static void Main()
{
Data data = new("foo");

object name = typeof(Data).GetField("Name").GetValue(data);

Console.WriteLine(name);
}
}

您不能对字段这样做,但是您可以将其转换为属性,然后添加代码来跟踪该过程。我们可以添加一个事件以方便跟踪:

class Data {
private string m_Name;
public string Name {
get => m_Name;
set {
// If we don't want to trigger event on each Name assignment
// but on actual chnages only  
if (string.Equals(m_Name, value))
return;  
// Before Changing
//TODO: fire event here if you want to track Name just befor changing
m_Name = value;
// After Changing
NameChanged?.Invoke(this, EventArgs.Empty); 
}
}

public Data(string name) {
Name = name;
}
// Event thar will be fired on each Name change
public event EventHandler NameChanged;
}

用法:

Data myData = new Data("");
// We register event handler
myData.NameChanged += (o, e) => {
Console.WriteLine($"Name changed into {((Data) o).Name}");
};
// And change the Name which will fire the event
myData.Name = "Some Other Name";

最新更新