C # Как сделать это внедрение анонимного метода - PullRequest
0 голосов
/ 10 июня 2011

Как использовать что-то подобное в C #.

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

Событие * Класс 1005 * и метод doWork () объявлен внутри Событие class.

Практически все, что происходит, заключается в том, что doWork () - это абстрактный метод, который должен быть создан с помощью приведенного выше кода.

Какой синтаксис используется для этого в C #?Можно ли вообще делать анонимные методы, как это?(Приведенный выше код не является допустимым синтаксисом, если кто-то не понимает этот вопрос.)

Спасибо, я ценю помощь.

Ответы [ 5 ]

0 голосов
/ 10 июня 2011

Чтобы выполнить внедрение метода, добавьте аргумент Action в конструкторе к Event, тогда вы можете сделать это следующим образом:

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

Event::Event(int time, Action action){...}
0 голосов
/ 10 июня 2011

Дайте вашему классу событий свойство типа 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");
    }
});
0 голосов
/ 10 июня 2011

Вы не можете иметь анонимные классы в C #.Это то, что вы спрашиваете?Но в C # вы обычно не реализуете класс для обработки события.

0 голосов
/ 10 июня 2011

Самое близкое, что я могу придумать, это:

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 #: делегированный синтаксис и лямбда-синтаксис.

0 голосов
/ 10 июня 2011

Нет, ты не можешь сделать это. Вам необходимо создать подкласс 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 один раз (назовите его как-нибудь лучше), а затем вы можете создавать его экземпляры с различными действиями, когда они вам нужны.

...