现在的位置: 首页 > 综合 > 正文

.NET基础扩展系列-使用反射设计插件

2012年12月30日 ⁄ 综合 ⁄ 共 1071字 ⁄ 字号 评论关闭

很多时候, 我们定义了一个功能接口, 可能有很多接口实现, 比如我们有一个系统, 有一个告警时间通知接口, 我们可能有短信的通知实现, 也可能有邮件的通知实现, 也可能有其他方式的通知实现, 如果根据需要加载呢?

 

有一种方式是, 将实现这个接口的所有的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;
            }
        }

当然还有其他的办法, 比如使用配置文件进行配置接口的实现有几个, 然后使用反射在初始化的时候进行加载, 但是万变不离其宗, 就是反射. 

抱歉!评论已关闭.