2011-10-22 59 views
0

我可以尝试使用func委托将消息发送到另一个类。我通常会与普通代表​​一起做这件事,但我正在尝试学习如何使用Func做到这一点。用下面的例子,我想让AClass用消息更新主类。正如你所看到的,我遇到了麻烦。使用Func代理在类之间发送消息

更新:我更新了示例以提供更好的细节。在这个例子中,我展示了如何使用委托来与主类进行通信。是否有可能使用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

+2

你需要什么建议?我可以告诉你,你不需要委托将消息发送到另一个类。只需在其他课程上调用一个方法即可。或者我可以告诉你,Func代表没有什么特别之处。这只是一个代表。 –

+0

目前尚不清楚你正在尝试做什么。告诉我们你认为应该发生什么以及以何种顺序应该调用各种InvokeMessage,ProcessMessage以及由谁发出 – xanatos

+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); 
      }     
     } 
    } 

这符合你的前一事件的代表团,因为它并不需要的输出参数。这是行动<'Tin>和Func <'Tin,Tout>之间的主要区别。如果您希望您的主类方法将数据返回给委托调用方,那么您将使用Func。如果我错过了您的要求,请告诉我。

+0

你钉了它。太棒了,谢谢 – PhillyNJ

相关问题