.NET基础扩展系列-使用反射设计插件
2007-02-05 09:20 爱车龟速兔 阅读(301) 评论(0) 编辑 收藏 举报很多时候, 我们定义了一个功能接口, 可能有很多接口实现, 比如我们有一个系统, 有一个告警时间通知接口, 我们可能有短信的通知实现, 也可能有邮件的通知实现, 也可能有其他方式的通知实现, 如果根据需要加载呢?
有一种方式是, 将实现这个接口的所有的dll放到一个指定目录下, 然后用反射的方式去加载实现.
代码如下:
Dictionary<string, IModelCodeGenerator> addInTypes = new Dictionary<string, IModelCodeGenerator>(); string[] AddInAssemblies = Directory.GetFiles(System.Environment.CurrentDirectory, "*.dll"); foreach (string file in AddInAssemblies) { Assembly addInAssembly = Assembly.LoadFile(file); foreach (Type t in addInAssembly.GetExportedTypes()) { if (t.IsClass && typeof(IModelCodeGenerator).IsAssignableFrom(t)) { IModelCodeGenerator ai = (IModelCodeGenerator)Activator.CreateInstance(t); addInTypes.Add(ai.GeneratorName, ai); } } } if (addInTypes.Count == 1) { foreach (IModelCodeGenerator ai in addInTypes.Values) { System.Windows.Forms.FolderBrowserDialog open = new System.Windows.Forms.FolderBrowserDialog(); if (open.ShowDialog() == System.Windows.Forms.DialogResult.OK) { string strFolderPath = open.SelectedPath; ai.GeneratorModelCode(Application.Current.Properties["Model"] as ConceptContainer, strFolderPath); } return; } }
当然还有其他的办法, 比如使用配置文件进行配置接口的实现有几个, 然后使用反射在初始化的时候进行加载, 但是万变不离其宗, 就是反射.