2011-10-22 61 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

相關問題