Dll程序集的多态应用
DLL程序集的多态:通俗点的说就是多个dll程序集都共同继承实现了同一个接口,但实现的方法不同;
例如:接口IWay中有一个Bind()方法,程序集A.dll,B.dll中的类继承IWay接口并实现Bind()方法,但是Bind()实现形式不同。程序集A通过WebService绑定,程序集B通过PHP接口绑定。这样添加新的绑定方式的话只需要添加一个Dll程序集(实现了IWay接口)就可以了,不需要修改绑定的其他的操作!
public class HelpClass { /// <summary> /// 获取指定目录下的DLL模块列表 /// </summary> /// <param name="path">模块文件所在目录</param> public ICardWay GetFileDllList(string path, string pWay) { try { //DirectoryInfo用来操作目录和子目录的,如复制,创建,移动,添加等 DirectoryInfo modules1 = new DirectoryInfo(path); //FileInfo用来操作文件或文件夹,如复制,创建,移动,添加等 foreach (FileInfo file in (modules1.GetFiles()))//GetFiles()获取目录中的文件 { //string name= Path.GetFileName(file.FullName);//获取一个完整路径的文件名 if (pWay == name)//获取目录中想要的dll文件 { Assembly assembly = Assembly.LoadFile(file.FullName);//下载下来dll文件 foreach (Type type in assembly.GetTypes())//GetTypes()获取程序集中定义的类型 { if (type.IsClass) //类对象 { var a = type.Name; //类的名字 foreach (Type t in type.GetInterfaces()) //GetInterfaces()获取类继承的所有的接口 { var b = t.Name; //接口的名字 if (t == typeof(ICardWay)) { object obj = assembly.CreateInstance(type.FullName); //根据类名创建对象 return obj as IWay; //转化为接口的类型 } } } } assembly = null; } } return null; } catch (Exception ex) { throw new Exception(ex.Message); } } }
通过接口来实现返回不同的对象,进而操作不同的方法(方法名称相同)。
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Help h = new Help(); IWay iw = h.BackObject(); //接口对象调用方法 iw.Run(); } } public interface IWay { void Run(); } public class Way : IWay { public void Run() { Console.WriteLine("接口的用法!"); } } public class Help { public IWay BackObject() { Way w = new Way(); return w as IWay; } } }