C#+替代委托

时间:2019-06-17 16:39:48

标签: c# delegates

我有一些代码正在使用无法绕过的第三方库。该库提供了我需要的一些辅助功能。目前,我的代码是这样设置的:

static Engine engine = new Engine();

static void Main(string[] args)
{
   engine.Execute(MyCode); 
}

private static void MyCode()
{
  // my code goes here
}

这是我的挑战:在MyCode可以使用它之前,我必须实例化一些代码,因为实例化必须命中数据库,并且花费的时间比Engine所允许的阈值长。我不能使用静态变量,因为将需要多个实例。这基本上意味着,我想要这样的东西:

static Engine engine = new Engine();

static void Main(string[] args)
{
   MyClass c = new MyClass();
   c.Initialize();  // This is the db call

   engine.Execute(MyCode); // This line is the problem
}

private static void MyCode(MyClass c)
{
  // my code goes here
  c.DoStuff();
}

我的问题是,我基本上需要创建一个带参数的重载方法。但是,第三方库中的Execute方法不允许我这样做。有什么C#语法方式可以做到这一点,而我却缺少了?

2 个答案:

答案 0 :(得分:4)

您正在寻找lambda表达式:

engine.Execute(() => MyCode(c));

答案 1 :(得分:0)

我假设Engine.Execute带有Action的实例。

您可以将MyCode函数设为MyClass上的实例成员函数,然后将MyClass.MyCode作为Engine.Execute传递给Action

public class Engine
{
    public void Execute(Action action)
    {
        action.Invoke();
    }
}

public class MyClass
{
    public void Initialize()
    {
        System.Threading.Thread.Sleep(500); //Simulate some work.
    }

    public void Run()
    {
        // I've renamed it from MyCode to Run, but this method is essentially your
        // my code method.
        Console.WriteLine($"I'm being run from the engine! My Id is {_id}.");
    }

    private readonly Guid _id = Guid.NewGuid();
}

public static class Program
{
   static void Main(string[] args)
   {
      var engine = new Engine();
      var c = new MyClass();
      c.Initialize();
      engine.Execute(c.Run);
   }
}