2016-08-11 9 views
0

イベントとプロパティが次のように定義されているインターフェイスを定義しました。デコレータでイベントとプロパティを定義する方法

public interface IMyInterface 
{ 
    event EventHandler SomeEvent; 
    string GetName(); 
    string IpAddress { get; set; } 
} 

私はクラスを作成し、それを使用すると、すべて正常に動作します。

デコレータを使用してこのクラスを拡張したいと思います。 イベントの処理方法がわかりません。私は明確であると思うプロパティのために、ただ確認をしたい

デコレータクラスを次のように定義しました。あなたがイベントを処理するべきではありません

public class LoggerDecorator : IMyInterface 
{ 
    private readonly IMyInterface _MyInterface; 
    private readonly ILog _MyLog; 
    public LoggerDecorator(IMyInterface myInterface, ILog myLog) 
    { 
     if (myInterface == null) 
      throw new ArgumentNullException("IMyInterface is null"); 
     _MyInterface = myInterface; 

     if (myLog == null) 
      throw new ArgumentNullException("ILog instance is null"); 
     _MyLog = myLog; 

    } 

    public string GetName() 
    { 
     // If needed I can use log here 
     _MyLog.Info("GetName method is called."); 
     return _MyInterface.GetName(); 
    } 

    // Is this the way to set properties? 
    public string IpAddress 
    { 
     get 
     { 
      return _MyInterface.IpAddress; 
     } 

     set 
     { 
      // If needed I can use log here 
      _MyLog.Info("IpAddress is set."); 
      _MyInterface.IpAddress = value; 
     } 
    } 


    // But How to handle this evetn?? Please help. I am not clear about this. 
    public event EventHandler SomeEvent; 

} 

答えて

1

、あなたがイベントを発生させることができます:

同様:C#6.0

SomeEvent?.Invoke(this, EventArgs.Empty); 
+0

私はそれを得ていると思います。私が試してみましょう。 – VivekDev

+1

イベントを定義するとき。他のオブジェクトはそれに登録することができます。だからあなたのオブジェクトは '知らない' /レシーバクラスに制限することなく 'コールバック'を行うことができます。この方法で、メソッドを通知/呼び出すことができるクラスを再利用できます。 –

0

中の

if(SomeEvent != null) 
    SomeEvent(this, EventArgs.Empty); 

[OK]を、私は思います答えを得た。

次はctorに入ります。

 _MyInterface.SomeEvent += _MyInterface_SomeEvent; 

であり、イベントハンドラ方法は以下の通りである。

private void _MyInterface_SomeEvent(object sender, EventArgs e) 
    { 
     var someEvent = SomeEvent; 
     if (someEvent != null) 
     { 
      someEvent(this, e); 
     } 
    } 

完全な実装は以下のようになります。

public class LoggerDecorator : IMyInterface 
{ 
    private readonly IMyInterface _MyInterface; 
    private readonly ILog _MyLog; 
    public LoggerDecorator(IMyInterface myInterface, ILog myLog) 
    { 
     if (myInterface == null) 
      throw new ArgumentNullException("IMyInterface is null"); 
     _MyInterface = myInterface; 

     if (myLog == null) 
      throw new ArgumentNullException("ILog instance is null"); 
     _MyLog = myLog; 

     // This is change 1. 
     _MyInterface.SomeEvent += _MyInterface_SomeEvent; 
    } 

    // This is change 2 
    private void _MyInterface_SomeEvent(object sender, EventArgs e) 
    { 
     var someEvent = SomeEvent; 
     if (someEvent != null) 
     { 
      someEvent(this, e); 
     } 
    } 

    public string GetName() 
    { 
     // If needed I can use log here 
     _MyLog.Info("GetName method is called."); 
     return _MyInterface.GetName(); 
    } 

    // Is this the way to set properties? 
    public string IpAddress 
    { 
     get 
     { 
      return _MyInterface.IpAddress; 
     } 

     set 
     { 
      // If needed I can use log here 
      _MyLog.Info("IpAddress is set."); 
      _MyInterface.IpAddress = value; 
     } 
    } 


    public event EventHandler SomeEvent; 

} 
関連する問題