C # + Переопределить делегат - PullRequest
1 голос
/ 17 июня 2019

У меня есть код, использующий стороннюю библиотеку, которую я не могу обойти. Эта библиотека предоставляет некоторые вспомогательные функции, которые мне нужны. В настоящее время мой код настроен так:

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 ]

4 голосов
/ 17 июня 2019

Вы ищете лямбда-выражения:

engine.Execute(() => MyCode(c));
0 голосов
/ 17 июня 2019

Я предполагаю, что 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);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...