Как вызвать функцию класса из другой библиотеки, не зная этого класса? - PullRequest
0 голосов
/ 17 января 2019

Проект, над которым я сейчас работаю (сводится к этой проблеме), состоит из 3 частей:

    - A server class
    - An interface
    - Plugins that implement the interface

Теперь я хочу отправить сообщение подключенному клиенту из плагина, который загружается как DLL через Reflection в проекте сервера. Конечно, мне нужна функция в классе моего сервера для отправки моего сообщения. Теперь вопрос состоит в том, как вызвать эту функцию из моего плагина, который знает только интерфейс без возможности получить одноэлементную реализацию класса сервера.

Теоретически я бы сказал, я установил пустой указатель на функцию в интерфейсе, который я затем, при загрузке плагина, указываю на мой метод, с помощью которого я затем отправляю сообщение клиенту. Единственное, что я нашел, - это делегаты, которые не могут быть определены в интерфейсе. Так что будет альтернативой?

Ниже псевдокода для иллюстрации. Я надеюсь, что вы понимаете, что я хотел бы сделать, и можете помочь мне найти решение. Важно, чтобы плагины не знали никаких функций о сервере, только метод SendMessage.

псевдокод:

public class Server{
    private List<Plugin> mPlugins = new List<Plugin>();

    public Server() {
        LoadPlugins();
    }

    public void SendMessage(string message) {
        // Here I would send my message to some client
    }

    private void LoadPlugins() {
        // Here I'm loading my plugins (*.dll) from a specific folder into my mPlugins list

        // And while I'm looping through my plugins and loading them, I would set the function pointer to SendMessage(); Like:
        plugin.SendMyMessage = SendMessage;
    }
}

public interface SomeAPI {
    string Name {get;set;}
    string Version {get;set;}

    delegate void SendMyMessage(string message);
}

public class SomePlugin : SomeAPI {
    public string Name {get;set;} = "Some plugin";
    public string Version {get;set;} = "v1.0.0";

    void SendMessage(string message) {
        SendMyMessage(message);
    }
}

1 Ответ

0 голосов
/ 17 января 2019

Есть много способов получить обратные вызовы от плагина (если я вас правильно понимаю)

Почему бы просто не использовать и События, Действия или Функции

public class ISomething
{
   public Action<string,ISomething> MyCallBack { get; set; }
}

public class Server
{
   private List<ISomething> mPlugins = new List<ISomething>();

   public Server()
   {
      LoadPlugins();
   }

   private void LoadPlugins()
   {
      foreach (var plugin in mPlugins)
         plugin.MyCallBack += MyCallBack;
   }

   private void MyCallBack(string message, ISomething plugin)
   {
      Console.WriteLine(message);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...