2011-07-19 190 views
2

它可以檢索訂閱C#中的事件的人嗎?訂閱事件的日誌

例如

class MyClass 
{ 
    public string Name { get; set; } 
} 

class Syncronizer 
{ 
    public delegate void SynchronizatonEventHandler(MyClass myClass); 
    public event SynchronizatonEventHandler OnSyncFinished; 
} 

如果我有這樣的事情有可能是我看到/使用myClass.Name字符串,並用它來記錄事件時訂閱?

我想完成的是我想記錄每一個訂閱和從我的Syncronizer類退訂。

回答

3

這裏有一個工作示例:

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.Name,因爲這並不在存在添加和刪除程序。我有它記錄(到Console.WriteLine)訂閱該事件的類和方法,也就是我認爲,你以後的事情。

5

你可以做到以下幾點:

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. 
     } 
    } 
} 
+1

此代碼會導致StackOverflowException ...除了事件,您還需要創建EventHandler類型的字段,並在事件訪問器中操作該字段 –

+0

我認爲這很清楚。我用一個完整的解決方案改變了答案。 – dknaack

1

你需要用自己的accessors創建一個明確的事件:

public event SynchronizatonEventHandler OnSyncFinished { 
    add { ... } 
    remove { ... } 
} 

addremove採取含委託實例的value參數被移除或添加到事件中。
爲了記錄目的,您可以獲得實例的MethodTarget屬性。

0

......這應該解決您的問題:

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