鉴于支持不同逻辑提供程序的.net应用程序,如何在解决方案文件夹中实例化每个类的一个实例?迭代文件夹中所有类的方法是什么?
例如,我的解决方案中有一个名为MailClientProviders
的文件夹
它包含Outlook和The Bat!实现IMailProvider接口的提供程序类。
在我的App.xaml中,我调用Ninject容器来初始化所有依赖项。然后我需要编写一个我将调用的方法,并获得返回的每个类的实例。
heartbeatService.Providers = CreateOneInstanceOfAllClassesInProvidresDir(MailClientProviders);
CreateOneInstanceOfAllClassesInProvidresDir
方法中的内容是什么?
答案 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
...