反射的用处就是:

在程序运行时、动态加载一个DLL,解析里面的信息,使用里面的类、方法、属性

每个程序集里面都有 元数据(Metadata),描述数据的数据(data about data),就是描述DLL里面有哪些类,哪些方法,哪些属性,反射就是读取 元数据。

这个LOAD方法不能带任何的扩展名,否则必须出错

Assembly SampleAssembly = Assembly.Load("WebLibrary");

 

必须带完整路径

Assembly assembly2 = Assembly.LoadFrom(@"E:\项目\VIP5\Reflection\bin\Debug\WebLibrary.dll")

反射的用处是非常多的。

1、MVC 路由的原理就是反射调用

2、.net 框架大量使用反射。

反射的作用在于给程序灵活性、扩展性、和维护性提供了极大的方便。

实际当中有以下用处:

1、接口配合反射来使用

        public static IHero GetInstanceByReflector()
        {
            string heroTypeReflector = System.Configuration.ConfigurationManager.AppSettings["heroTypeReflector"];

            string assemblyName = heroTypeReflector.Split(',')[0];
            string typeName = heroTypeReflector.Split(',')[1];
            return (IHero)Activator.CreateInstance(assemblyName, typeName).Unwrap();
        }

接口+反射为程序的扩展提供了无限的可能性。

例1:假如你的程序当中有一个地方引入第三方的短信平台、这个地方经常变化,而且不稳定、你需要制定一个接口、同时做一个简单工厂,和反射共同来切换这个第三方插件。

列2:你做一个音乐播放器、能够播放的格式肯定也不是写死的、假如有一种新的格式出来、你需要动态的升级、实际最佳解决方案就是,简单工厂+反射+接口


2、反射来调用方法(Type.GetMethod("MethodName"),Type.GetMethods()

            Assembly SampleAssembly = Assembly.Load("WebLibrary");///这个地方不能带后缀,带扩展名就出错

            foreach (Type oType in SampleAssembly.GetTypes()) { 
                Console.WriteLine(oType.Name);
                AssemblyGetMethods(oType);
            }
        /// <summary>
        /// 列出所有方法
        /// </summary>
        /// <param name="oType"></param>
        public static void AssemblyGetMethods(Type oType)
        {
            foreach (var method in oType.GetMethods())
            {
                Console.WriteLine(method.Name);
                ///调用该方法
                method.Invoke(oType, new object[] { "汗神VS水鬼" });

                //method.Invoke(doSomethingRelect, new object[] { "汗神VS水鬼", 1 });
            }
        }
            ///获取类
            Type typeSome = SampleAssembly.GetType("Elephant.Service.DoSomething");
            ///获取类下面的方法
            MethodInfo methodShowReflect = typeSome.GetMethod("ShowSomething");
            ////执行这个方法
            methodShowReflect.Invoke(SampleAssembly, new object[] { "汗神VS水鬼" });

3、赋值(Type.GetProperties(),返回 PropertyInfo

                foreach (var property in typeSome.GetProperties())
                {
                    //Console.WriteLine(property.Name);
                    //string propertyName = property.Name;
                    property.SetValue(oObjectSome, ht[property.Name]);
                }

 

posted on 2016-06-02 17:54  梦回过去  阅读(226)  评论(0)    收藏  举报