反射的用处就是:
在程序运行时、动态加载一个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]); }
浙公网安备 33010602011771号