C# 使用Func委托在类之间发送消息

C# 使用Func委托在类之间发送消息,c#,delegates,C#,Delegates,我可以尝试使用func委托将消息发送到另一个类。我通常是通过一个普通的委托来完成这项工作,但我正在尝试学习如何通过Func来完成这项工作。在下面的示例中,我希望AClass使用消息更新主类。正如你所看到的,我遇到了麻烦 更新:我更新了示例以提供更好的细节。在这个示例中,我展示了如何使用委托与主类通信。是否可以使用func委托执行此操作 class Program { static void Main(string[] args) { AClass aClass =

我可以尝试使用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);
    }
}

任何建议都将不胜感激。thx

我想我理解你想要实现的目标。据我所知,您希望使用委托来处理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);
            }                
        }
    }
static void Main(字符串[]args)
{
AClass AClass=新的AClass();
aClass.MessageDelegate=ProcessMessage;
//发送消息(无论如何都不需要通过委托写入输出)
Console.WriteLine(aClass.MessageSender(50));
Console.ReadLine();
}
/// 
///用作委托(从AClass传递到此处的消息)
/// 
/// 
公共静态void ProcessMessage(字符串混乱)
{
Console.WriteLine(“此处处理消息:+mess”);
}
类AClass
{
公共行动信息代表
{get;set;}
公共AClass()
{
}
公共字符串MessageSender(int i)
{
调用消息(“消息:+i”);
return“Message:+i;
}
公共void InvokeMessage(字符串混乱)
{
if(MessageDelegate!=null)
{
信息代表(mess);
}                
}
}

这与您以前的事件委派相匹配,因为它不需要输出参数。这是行动之间的主要区别。如果希望主类方法将数据返回给委托调用方,则应使用Func。如果我在您的要求中遗漏了什么,请告诉我。

您需要什么建议?我可以建议您,您不需要委托人向另一个类发送消息。只需在另一个类上调用一个方法。或者我可以告诉你Func委托没有什么特别的。这只是一个代表,不清楚你想做什么。告诉我们您认为应该发生什么,各种InvokeMessage、ProcessMessage的调用顺序,以及由谁来执行?您可以演示如何使用“普通”委托执行此操作吗?您的代码工作正常,但您没有提供足够的详细信息说明您需要改进或修复/增强的内容。@DavidePiras“您的代码工作正常”。。。我会说“您的代码可以编译并执行某些操作”:-)
    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);
            }                
        }
    }