簡體   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