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;
        }
    }
}
posted @ 2012-10-15 23:09  学之乐  阅读(484)  评论(0编辑  收藏  举报