【问题标题】:C# How to do this anonymous method injectionC#如何做这个匿名方法注入
【发布时间】:2011-06-10 09:40:39
【问题描述】:

如何在 C# 中使用类似的东西。

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

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

doWork() 几乎是由上面的代码创建的抽象方法。

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

谢谢你的帮助。

【问题讨论】:

  • 您写了“Event 类并且 doWork() 方法在 Event 类中声明。”如何在 Event 类中声明 Event 类?它是在自己内部声明的吗?
  • 公共抽象无效doWork(); Event.cs里面没有方法。

标签: c# anonymous-methods anonymous-class


【解决方案1】:

不,你不能这样做。 你需要创建一个 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(称之为更好的名称),然后您可以在需要时使用不同的操作创建它的实例。

【讨论】:

  • 好的,但我必须在代码流中间创建这些事件
  • 好的,那么您需要创建一个派生自 Event 的类,该类接受一个动作。
  • 更新答案以做你想做的事。
  • 看起来不错,我马上试试。
  • 累这个,但是怎么调用this.stop()..stop()是Event的一个方法。
【解决方案2】:

在 C# 中不能有匿名类。这就是你要问的吗?但在 C# 中,您通常不会实现用于处理事件的类。

【讨论】:

  • 除了使用计时器类之外,在我的代码中按需制作事件的其他选择是什么。
  • 我真的不明白你想要达到什么目的。
  • 我想在课堂上按需制作活动……但要保持良好的设计。不在新类中制作事件..而是将所有逻辑保存在同一个类文件中。啊,没关系,我想我会尝试其他的。
  • 我还是不明白你的要求。什么是“点播活动”?
  • 啊,只是想保持它的漂亮外观并在我想要的时候以简单的方式创建事件以使脚本易于制作。
【解决方案3】:

我能想到的最接近的事情是这样的:

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 语法。

【讨论】:

    【解决方案4】:

    给你的事件类一个 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");
        }
    });
    

    【讨论】:

      【解决方案5】:

      要实现方法注入,在 Event 的构造函数中添加一个 Action 参数,然后你可以这样做;

      Console.WriteLine("yaya instant");
      Server.registerEvent(
          new Event(5000, () {
              stop();
              Console.WriteLine("yaya 5 seconds later");
              )
          );
      
      Event::Event(int time, Action action){...}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-11
        • 1970-01-01
        • 2015-02-09
        • 2020-03-25
        • 1970-01-01
        相关资源
        最近更新 更多