繁体   English   中英

教我们如何使用Delegate并在C#中引发事件

[英]Teach us how to use Delegate and to raise an event in C#

我有2个类,Printer和MessageOrigin。 打印机实例化MessageOrigin。 在MessageOrigin类中,我可以获取我需要的消息,但是我必须将它返回给Printer类,以便可以在控制台上编写。 我想我必须使用Delegate和Event Raiser来完成这项工作。 有很多教程和解释,但很难理解它,更不用说实现它了。 可能通过解决我在这里遇到的问题将更容易理解如何使用它。 请参阅下面的示例代码,并教我们如何在C#中使用委托和引发事件。

Class Printer
{
    MessageOrigin mo = new MessageOrigin();

    printMessage(string message) {
        console.WriteLine(message) // message here should come from the MessageOrigin class
    }
}

class MessageOrigin
{
    public void GetMessage() {
        var msgs = Get_All_Message();
        SendMessageToPrintClass(msgs);
    }

    public void SendMessageToPrintClass(string message) {
        // how do I send the "message" parameter back to the Printer class
    }
}

感谢您的耐心等待。

您可以使用活动 MessageOrigin类将是发布者,而类Printer将是订阅者。 优点是,以后您可以添加更多订阅者,而无需更改MessageOrigin类。

class Printer
{
    MessageOrigin mo = new MessageOrigin();

    public Printer()
    {
        mo.NewMessage += PrintMessage; // Subscribe to the event
    }

    void PrintMessage(string message)
    {
        Console.WriteLine(message);
    }
}

class MessageOrigin
{
    public event Action<string> NewMessage; // Declare the event

    public void GetMessage()
    {
        string msgs = Get_All_Message();
        NewMessage?.Invoke(msgs); // Raise the event
    }
}

如果我理解正确,我认为你不需要代表(虽然)你可以使用它。 如果要访问Printer类/对象。

我的建议是(如果您的架构允许)将打印机对象的引用传递给MessageOrigin类。

你可以这样做:

public class Printer
{
    private MessageOrigin mo;

    public Printer() 
    {
        mo = new MessageOrigin(this);
    }


    public void printMessage(string message) 
    {
        Console.WriteLine(message); // message here should come from the MessageOrigin class
    }
}

public class MessageOrigin
{
    private Printer _parentPrinter;
    public MessageOrigin(Printer print) 
    {
        _parentPrinter = print;
    }
    public string Get_All_Message() 
    {
        //implementation
        return string.Empty;
    }
    public void GetMessage() {
        var msgs = Get_All_Message();
        SendMessageToPrintClass(msgs);
    }

    public void SendMessageToPrintClass(string message) {
        // how do I send the "message" parameter back to the Printer class
       _parentPrinter.Message = message //note that you need to implement your message method/property.
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM