记录谁订阅了一个事件
本文关键字:一个 事件 记录 | 更新日期: 2023-09-27 18:02:26
是否可以检索c#中订阅事件的人?
例子class MyClass
{
public string Name { get; set; }
}
class Syncronizer
{
public delegate void SynchronizatonEventHandler(MyClass myClass);
public event SynchronizatonEventHandler OnSyncFinished;
}
如果我有这样的东西是可能的,我看到/使用myClass。名称字符串并在订阅事件时使用它进行日志记录?
我想要完成的是,我想记录每个订阅和取消订阅从我的同步器类
您可以这样做:
class MyClass
{
public string Name { get; set; }
}
class Syncronizer
{
public delegate void SynchronizatonEventHandler(MyClass myClass);
internal event SynchronizatonEventHandler _onSyncFinished;
public event SynchronizatonEventHandler OnSyncFinished
{
add
{
// Perform some code before the subscription.
// Add the event.
_onSyncFinished += value;
// Perform some code after the subscription;
}
remove
{
// Perform some code before the subscription.
// Remove the event.
_onSyncFinished -= value;
// Peroform some code after the subscription.
}
}
}
下面是一个工作示例:
class Syncronizer
{
public delegate void SynchronizatonEventHandler(MyClass myClass);
private event SynchronizatonEventHandler onSyncFinished;
public event SynchronizatonEventHandler OnSyncFinished
{
add
{
var method = new StackTrace().GetFrame(1).GetMethod();
Console.WriteLine("{0}.{1} subscribing", method.ReflectedType.Name, method.Name);
onSyncFinished += value;
}
remove
{
var method = new StackTrace().GetFrame(1).GetMethod();
Console.WriteLine("{0}.{1} unsubscribing", method.ReflectedType.Name, method.Name);
onSyncFinished -= value;
}
}
}
注意你不能记录myClass。名称,因为它不存在于添加和删除过程中。我让它记录(到Console.WriteLine)订阅事件的类和方法,我想这就是你想要的。
您需要使用您自己的访问器创建显式事件:
public event SynchronizatonEventHandler OnSyncFinished {
add { ... }
remove { ... }
}
add
和remove
接受一个value
参数,该参数包含从事件中移除或添加到事件中的委托实例。
为了记录日志,您可以获取实例的Method
和Target
属性。
……像这样应该可以解决您的问题:
private event SynchronizatonEventHandler m_OnSyncFinished;
public event SynchronizatonEventHandler OnSyncFinished
{
add
{
// Custom code could be added here...
m_OnSyncFinished += value;
}
remove
{
// Custom code could be added here...
m_OnSyncFinished -= value;
}
}