我有一个插件系统,我的插件类看起来像这样
namespace CSV_Analyzer_Pro.Core.PluginSystem
{
public interface IPlugin
{
string Name { get; }
string Version { get; }
string TargetVersion { get; }
string Description { get; }
string TargetFramework { get; }
void Action();
}
}
在我的loader类中,我有一个函数调用每个插件的Action
方法,该方法在加载应用程序时被调用
public void Init()
{
if(Plugins != null)
{
Plugins.ForEach(plugin => plugin.Action());
}
}
我想使用类似的方法,以便我可以在我的应用程序中调用
loader.getByTargetFramework("UI");
这应该让所有插件都针对"UI"
框架并将它们放在一个列表中然后我可以遍历这些方法
这是我到目前为止所拥有的
public void GetPluginByTargetFramework(string framework)
{
//Get all plugins
List<IPlugin> frameworkPlugs = new List<IPlugin>();
//Put all plugins targeting framework into list
if(frameworkPlugs != null)
{
frameworkPlugs.ForEach(plugin => plugin.Action());
}
}
如果有助于了解这里的不同变量是整个PluginLoader
类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
namespace CSV_Analyzer_Pro.Core.PluginSystem {
public class PluginLoader {
public static List<IPlugin> Plugins { set; get; }
public void LoadPlugins() {
Plugins = new List<IPlugin>();
if (Directory.Exists(Constants.PluginFolder)) {
string[] files = Directory.GetFiles(Constants.PluginFolder);
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 void Init() {
if(Plugins != null) {
Plugins.ForEach(plugin => plugin.Action());
}
}
public void GetPluginByTargetFramework(string framework) {
//Get all plugins
List<IPlugin> frameworkPlugs = new List<IPlugin>();
//Put all plugins targeting framework into list
if(frameworkPlugs != null) {
frameworkPlugs.ForEach(plugin => plugin.Action());
}
}
}
}
答案 0 :(得分:1)
使用linq&#39; .Where
:
frameworkPlugs = Plugins.Where(p => p.TargetFramework == framework);
将所有内容放在一起你可以:
public void GetPluginByTargetFramework(string framework)
{
Plugins.Where(p => p.TargetFramework == framework)
.ToList().ForEach(p => p.Action());
//Better to use a foreach loop on the items returned from the where
foreach(var item in Plugins.Where(p => p.TargetFramework == framework)
item.Action();
}
请注意,不需要检查集合是否为空,因为linq查询返回IEnumerable<T>
,它永远不会为空 - 如果没有匹配where
它将为空,但是不为空。
如果您想比较不区分大小写的字符串,请查看:linq case insensitive (without toUpper or toLower)
答案 1 :(得分:1)
您需要过滤插件列表;使用Where方法。
public void GetPluginByTargetFramework(string framework)
{
if (Plugins == null) return;
foreach (var p in Plugins.Where(p => p.TargetFramework == framework))
p.Action();
}
BTW,名称与它的操作不匹配。建议更改为InitForFramework
。