我有一些代码正在使用无法绕过的第三方库。该库提供了我需要的一些辅助功能。目前,我的代码是这样设置的:
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#语法方式可以做到这一点,而我却缺少了?
答案 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);
}
}