NET基础学习笔记11---反射
反射
反射:就是动态获取程序集中的元数据来操作类型的。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Reflection; 6 7 namespace 反射的应用获取dll 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 #region 1加载指定的程序集,并获取该程序集中的所以的类型 14 //Assembly asm = Assembly.LoadFrom("TestReflect.dll"); 15 //Type[] types = asm.GetTypes(); 16 //foreach (Type typeitem in types) 17 //{ 18 // Console.WriteLine(typeitem.Name); 19 //} 20 //Console.WriteLine("---------------------------------------------------------------"); 21 //Type[] types2 = asm.GetExportedTypes(); 22 //foreach (Type type2item in types2) 23 //{ 24 // Console.WriteLine(type2item.Name); 25 //} 26 #endregion 27 28 #region 2获取加载程序集,获取Class1下的所以的方法 29 //Assembly asb = Assembly.LoadFrom("TestReflect.dll"); 30 //Type classtype = asb.GetType("TestReflect.Class1"); 31 32 //MethodInfo[] Methods= classtype.GetMethods(); 33 //foreach (MethodInfo Methoditem in Methods) 34 //{ 35 // Console.WriteLine(Methoditem.Name); 36 //} 37 #endregion 38 39 #region 3获取加载程序集,调用Class1下的所以的方法 40 Assembly asb = Assembly.LoadFrom("TestReflect.dll"); 41 Type classtype = asb.GetType("TestReflect.Class1"); 42 object obj = Activator.CreateInstance(classtype); 43 44 MethodInfo Methods = classtype.GetMethod("getName"); 45 Console.WriteLine(Methods.Invoke(obj, new object[] { "小庄" })); 46 47 #endregion 48 49 Console.ReadKey(); 50 } 51 } 52 }
1.获取程序集
Assembly asm=Assembly.LoadFrom("路径");
asm.GetTypes();获取程序集里面的所以类型。
asm.GetExportedTypes();获取程序集里面的所以公有类型。
Type classtype = asm.GetType("命名空间.类型名称")获取指定的类型。
classtype.GetMethods();获取类型里面的所以方法。
object obj=Activator.CreateInstance(classtype);创建这个类型的对象。
MethodInfo Methods=classtype.GetMethod("方法名称");获得类型里面的方法。
Methods.Invoke(obj,new object[]{});调用方法。传入类型和参数数组。
调用Private里面的方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace _1调用private方法 { class Program { static void Main(string[] args) { Type PersonType = typeof(Person); object obj = Activator.CreateInstance(PersonType); //调用private成员要添加BindingFlags.NonPublic | BindingFlags.Instance 不然会获取不到方法。 MethodInfo info = PersonType.GetMethod("SayHi",BindingFlags.NonPublic|BindingFlags.Instance); info.Invoke(obj, null); Console.ReadKey(); } } public class Person { private void SayHi() { Console.WriteLine("hi"); } } }
扩展方法的使用(一般不建议使用)
扩展方法的步骤:
1.创建静态类。
2.创建静态方法。
3.产生关联,
如:Public bool IsEmail(this string msg)
第一个参数,代表这个方法产生关联
第二个参数,关联对象,就是一个类型(string),msg是实体。