插件 C# 上的事件

Event on plugins C#

我有基于插件的控制台应用程序。
当在控制台上按下某个键时,我想为插件发送一个事件,以便插件执行必要的工作
我应该向 PluginManager.cs 添加什么代码?

这是插件管理器来源:

public static List<IPlugin> Plugins { get; set; }

public void LoadPlugins(string folderpath) {
    Plugins = new List<IPlugin>();

    if (Directory.Exists(folderpath))
    {
        string[] files = Directory.GetFiles(folderpath);
        foreach (string file in files)
        {
            if (file.EndsWith(".dll"))
            {
                Assembly.LoadFile(Path.GetFullPath(file));
            }
        }
    }

    Type interfaceType = typeof(IPlugin);
    Type[] types = AppDomain.CurrentDomain.GetAssemblies()
        .SelectMany(a => a.GetTypes())
        .Where(p => interfaceType.IsAssignableFrom(p) && p.IsClass)
        .ToArray();
    foreach (Type type in types)
        Plugins.Add((IPlugin)Activator.CreateInstance(type));
}

public static void Write(string parameters) {
    Console.WriteLine("[{0}] {1}", DateTime.Now, parameters);
}

IPlugin:

public interface IPlugin {
    string Command { get; }
    string Discription { get; }
    void Execute(string parameters);
    void OnLoad();
    void OnDown();
}

插件示例:

public class Say : IPlugin {
    public void Execute(string parameters) { PluginManager.Write(parameters); }
    public void OnLoad() { PluginManager.Write("Enabling Say"); }
    public void OnDown() { PluginManager.Write("Disabling Say"); }
    public string Command  { get { return "Say"; } }
    public string Discription { get { return "Write that you want"; } }
}

你可以定义一个接口

interface IConsumeKeyboardEvents
{
  void OnKeyPress(ConsoleKey key);
}

并仅由需要获取按键事件的插件实现:

public class Say : IPlugin, IConsumeKeyboardEvents
{
    public void OnKeyPress(ConsoleKey key) 
    { }
}

然后您的插件管理器可以使用此接口调用所有插件。对于 C# 8.0 版或更高版本:

public void OnKeyPress(ConsoleKey key) 
{
    foreach (var plugin in Plugins)
    {
        if (plugin is IConsumeKeyboardEvents keyboardPlugin)
        {
            keyboardPlugin.OnKeyPress(key);
        }
    }
}

如果你用的是8.0之前的C#(所以不支持模式匹配),这个要改成:

public void OnKeyPress(ConsoleKey key) 
{
    foreach (var plugin in Plugins)
    {
        var keyboardPlugin = plugin as IConsumeKeyboardEvents;
        if (keyboardPlugin != null)
        {
            keyboardPlugin.OnKeyPress(key);
        }
    }
}