获取与字符串c#

时间:2017-09-17 05:34:27

标签: c#

我有一个插件系统,我的插件类看起来像这样

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());
            }
        }
    }
}

2 个答案:

答案 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