从解决方案文件夹加载所有提供程序类

时间:2011-10-29 12:19:42

标签: c#

鉴于支持不同逻辑提供程序的.net应用程序,如何在解决方案文件夹中实例化每个类的一个实例?迭代文件夹中所有类的方法是什么?

例如,我的解决方案中有一个名为MailClientProviders的文件夹 它包含Outlook和The Bat!实现IMailProvider接口的提供程序类。

在我的App.xaml中,我调用Ninject容器来初始化所有依赖项。然后我需要编写一个我将调用的方法,并获得返回的每个类的实例。

heartbeatService.Providers = CreateOneInstanceOfAllClassesInProvidresDir(MailClientProviders);

CreateOneInstanceOfAllClassesInProvidresDir方法中的内容是什么?

2 个答案:

答案 0 :(得分:3)

Directory.GetFiles("MailClientProviders", "*.dll")获取文件夹中的所有dll,然后Assembly.LoadFrom获取每个返回的结果,并为每个程序集Assembly.GetTypes获取所有公共类型,并为每种类型检查是否实现了所需的接口,如果它Activator.CreateInstance实例化它。

答案 1 :(得分:2)

我使用这些函数来检索实现我的自定义界面的文件夹中的所有类:

public static List<T> GetFilePlugins<T>(string filename)
{
    List<T> ret = new List<T>();
    if (File.Exists(filename))
    {
        Type typeT = typeof(T);
        Assembly ass = Assembly.LoadFrom(filename);
        foreach (Type type in ass.GetTypes())
        {
            if (!type.IsClass || type.IsNotPublic) continue;
            if (typeT.IsAssignableFrom(type))
            {
                T plugin = (T)Activator.CreateInstance(type);
                ret.Add(plugin);
            }
        }
    }
    return ret;
}
public static List<T> GetDirectoryPlugins<T>(string dirname)
{
    List<T> ret = new List<T>();
    string[] dlls = Directory.GetFiles(dirname, "*.dll");
    foreach (string dll in dlls)
    {
        List<T> dll_plugins = GetFilePlugins<T>(Path.GetFullPath(dll));
        ret.AddRange(dll_plugins);
    }
    return ret;
}

因此,您可以运行GetDirectoryPlugins<IMailProvider>并在每个找到的课程中使用Activator.CreateInstance ...