插件 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);
}
}
}
我有基于插件的控制台应用程序。
当在控制台上按下某个键时,我想为插件发送一个事件,以便插件执行必要的工作
我应该向 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);
}
}
}