使用Func Delegates在类之间发送消息

时间:2011-10-22 13:31:09

标签: c# delegates

我可以尝试使用func委托将消息发送到另一个类。我通常使用常规代表执行此操作,但我正在尝试使用Func来学习如何执行此操作。通过下面的示例,我希望AClass使用消息更新主类。如你所见,我遇到了麻烦。

更新:我更新了示例以提供更好的细节。在示例中,我将展示如何使用委托与主类进行通信。是否可以使用func委托执行此操作?

class Program
{
    static void Main(string[] args)
    {
        AClass aClass = new AClass();
        // old way
        aClass.MessageEvent += new AClass.MessageEventHandler(ProcessMessage);
        aClass.MessageSender(50);

        // new way
        Func<int, String> fDelegate = aClass.MessageSender;            
        Console.WriteLine(fDelegate(10));
        Console.ReadLine();
    }

    public static void ProcessMessage(String mess) {

        Console.WriteLine("Process message here: " + mess);
    }
}

class AClass {

    public event MessageEventHandler MessageEvent;
    public delegate void MessageEventHandler(String value);

    public AClass() {           
    }

    public String MessageSender(int i) {

        InvokeMessage("Message: " + i);
        return "Message: " + i;                                
    }

    public void InvokeMessage(String mess) {

        this.MessageEvent("Message sent via delegate: " + mess);
    }
}

输出:

Process message here: Message sent via delegate: Message: 50
Process message here: Message sent via delegate: Message: 10
Message: 10

任何建议表示赞赏。 THX

1 个答案:

答案 0 :(得分:1)

我想我明白你想要完成的事情。根据我的理解,您希望使用委托来处理来自AClass的主类中的数据。即使使用泛型代理,也有很多方法可以做到这一点,但这里有一个例子:

    static void Main(string[] args)
    {
        AClass aClass = new AClass();
        aClass.MessageDelegate = ProcessMessage;
        // Send Message (writing of output unnecessary as it happens via the delegate anyway)
        Console.WriteLine(aClass.MessageSender(50));

        Console.ReadLine();
    }

    /// <summary>
    /// Used as delegate (messages passed from AClass to here)
    /// </summary>
    /// <param name="mess"></param>
    public static void ProcessMessage(String mess)
    {
        Console.WriteLine("Process message here: " + mess);
    }

    class AClass
    {
        public Action<string> MessageDelegate
        { get; set; }

        public AClass()
        {
        }

        public String MessageSender(int i)
        {
            InvokeMessage("Message: " + i);
            return "Message: " + i;
        }

        public void InvokeMessage(String mess)
        {
            if (MessageDelegate != null)
            {
                MessageDelegate(mess);
            }                
        }
    }

这与您之前的事件委托相匹配,因为它不需要输出参数。这是Action&lt;'Tin&gt;之间的主要区别。和Func&lt;'Tin,Tout&gt;。如果您希望主类方法将数据返回给委托调用者,那么您将使用Func。如果我错过了您的要求,请告诉我。