2011-06-10 48 views
0

如何在C#中使用這樣的東西。C#如何做這個匿名方法注入

Console.WriteLine("yaya instant"); 
Server.registerEvent(new Event(5000) { 
    public void doWork() { 
     this.stop(); 
     Console.WriteLine("yaya 5 seconds later"); 
    } 
    }); 

事件類和的doWork()方法內事件類聲明。

正在發生的事情是doWork()是應該由上面的代碼創建的抽象方法。

什麼是適當的語法在C#中做到這一點?是否有可能做這樣的匿名方法? (如果有人不明白這個問題,上面的代碼是無效的語法。)

謝謝我欣賞幫助。

+0

您寫下了「事件類和doWork()方法在Event類中聲明」。 Event類如何在Event類中聲明?它是否在其內部進行聲明? – 2011-06-10 09:55:35

+0

public abstract void doWork();在Event.cs裏面沒有方法。 – SSpoke 2011-06-10 10:13:43

回答

0

不,你不能這樣做。 您需要創建一個接受操作的Event類。

public class MyEvent: Event 
{ 
    private Action _action;   

    public MyEvent(int milliseconds, Action action) 
     : base(milliseconds) 
    { 
     _action= action; 
    } 

    public override void doWork() 
    { 
     action() 
    } 
} 

然後,你可以這樣做:

Server.registerEvent(new MyEvent(5000,() => 
    { 
     this.stop(); 
     Console.WriteLine("yaya 5 seconds later"); 
    })); 

你只需要一次申報MyEvent(稱之爲更好的東西),然後在需要時您可以創建不同的動作它的實例。

+0

好吧,但我必須在代碼流中創建這些事件 – SSpoke 2011-06-10 09:56:26

+0

好吧,那麼您需要創建一個從Event接收動作的類。 – Ray 2011-06-10 09:58:50

+0

更新答案以做你想做的事。 – Ray 2011-06-10 10:03:05

0

你不能在C#中有匿名類。你在問什麼?但在C#中,通常不會實現類來處理事件。

+0

我的其他選擇是在我的代碼中使用定時器類來製作事件。 – SSpoke 2011-06-10 09:55:45

+0

我真的不明白你想要達到什麼目的。 – 2011-06-10 09:57:07

+0

我想在所有的課堂上按照需求開展活動......但保持一個不錯的設計。不需要在新的類中創建事件,而是將所有的邏輯保存在同一個類文件中。啊,這沒關係我想我會嘗試別的。 – SSpoke 2011-06-10 10:01:57

0

我能想到的最接近的事是這樣的:

using System; 
using System.Threading; 

namespace SO6304593 
{  
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("yaya instant"); 

      Thread t1 = new Thread(delegate(object x) { Thread.Sleep((int)x); Console.WriteLine("Hello 1");}); 
      Thread t2 = new Thread(x => {Thread.Sleep((int)x); Console.WriteLine("Hello 2");}); 

      t1.Start(5000); 
      t2.Start(3000); 
      t1.Join(); 
      t2.Join(); 
     } 
    } 
} 

這是你所追求的?以上是在C#中使用匿名方法的兩個示例:委託語法和lambda語法。

0

給你的事件類型動作的屬性:

public class Event 
{ 
    public Action doWork { get; set; } 
} 

然後使用方法如下:

Console.WriteLine("yaya instant"); 
Server.registerEvent(new Event(5000) { 
    doWork = delegate { 
     this.stop(); 
     Console.WriteLine("yaya 5 seconds later"); 
    } 
}); 
0

爲了實現該方法注射在構造函數中的事件添加了操作ARG,那麼你可以像這樣做;

Console.WriteLine("yaya instant"); 
Server.registerEvent(
    new Event(5000,() { 
     stop(); 
     Console.WriteLine("yaya 5 seconds later"); 
     ) 
    ); 

Event::Event(int time, Action action){...} 
+0

太棒了,洙很好的答案! – SSpoke 2011-06-10 10:16:07