记录谁订阅了一个事件

本文关键字:一个 事件 记录 | 更新日期: 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 { ... }
}

addremove接受一个value参数,该参数包含从事件中移除或添加到事件中的委托实例。
为了记录日志,您可以获取实例的MethodTarget属性。

……像这样应该可以解决您的问题:

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;
  }
}