2017-06-05 80 views
1

我正在创建一个可以接收来自各种不同来源的消息的系统。从接口实现自定义事件处理程序

使用interface方法,我添加了一个自定义事件,它将消息传递回调用应用程序。

我用Vistual Studio的“脚手架”使用Ctrl-.提供具体类的实现,但其增加了addremove元素,但我真的不知道如何连接该位了。

接口类

public class MessageEventArgs : EventArgs 
{ 
    public Message { get; set; } 
} 

public interface MessageBroker 
{ 
    void Start(); 

    event EventHandler<MessageEventArgs> OnMessageReceived; 
} 

实现类

public class MessageSourceA : MessageBroker 
{ 
    event EventHandler<MessageEventArgs> MessageBroker.OnMessageReceived 
    { 
     add 
     { 
      // What goes here 
     } 

     remove 
     { 
      // What goes here 
     } 
    } 

    void MessageBroker.Start() 
    { 
    } 
} 

主程序

static void Main(string[] args) 
    { 
     MessageBroker sourceA = new MessageSourceA(); 
     sourceA.OnMessageReceived += sourceA_OnMessageReceived; 
    } 

    private static void sourceA_OnMessageReceived(object sender, MessageEventArgs e) 
    { 
     // Do stuff with message 
    } 

谢谢...

+0

你通常不需要这些,只要在“OnMessageReceived”之后加上一个分号(除去身体),除非你做了一些特殊的事情。然后你可以像调用其他方法一样调用它(检查它是否为空)。 – john

+1

是否必须明确实施? –

+1

请参阅[文档](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/add)以获取更多详细信息和示例[如何:实现接口事件](https:/ /docs.microsoft.com/en-us/dotnet/csharp/programming-guide/events/how-to-implement-interface-events) – Reniuz

回答

1

你通常可以从接口实现。

public class MessageSourceA : IMessageBroker 
{ 
    public void Start(); 
    public event EventHandler<MessageEventArgs> OnMessageReceived; 
} 

我建议您将MessageBroker重命名为IMessageBroker作为其命名约定。由于“I”在查看代码时有助于区分类和接口。

如果适当有理由实现接口明确你需要私人事件处理程序。

private event EventHandler<MessageEventArgs> _onMessageReceived; 

event EventHandler<MessageEventArgs> MessageBroker.OnMessageReceived 
{ 
    add 
    { 
     _onMessageRecieved += value; 
    } 
    remove 
    { 
     _onMessageRecieved -= value; 
    } 
} 
+0

是的,“我”在那里,当我复制时它已经掉落。添加了PUBLIC范围,并且现在已将其全部排序 –

相关问题