C#如何进行匿名方法注入

时间:2011-06-10 09:40:39

标签: c# anonymous-methods anonymous-class

如何在C#中使用这样的东西。

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

事件类和 doWork()方法在事件类中声明。

正在发生的事情是doWork()是抽象方法,它应该由上面的代码创建。

在C#中使用正确的语法是什么意思?甚至可以做这样的匿名方法吗? (如果有人不理解这个问题,上面的代码是无效的语法。)

谢谢,我感谢您的帮助。

5 个答案:

答案 0 :(得分: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一次(称之为更好的东西),然后你可以在需要时用不同的动作创建它的实例。

答案 1 :(得分:0)

你不能在C#中拥有匿名类。那是你在问什么?但是在C#中,你通常不会实现一个用于处理事件的类。

答案 2 :(得分: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语法。

答案 3 :(得分:0)

为您的事件类提供Action类型的属性:

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

答案 4 :(得分:0)

要实现方法注入,请在构造函数中将Action arg添加到Event,然后就可以这样做;

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

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