定义:反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数等。有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道
示例:
//Assembly===》 获取程序集的信息 方便我们想要获取那个类 并进行实例化 //Type的方法===》获取类里面的具体字段 构造函数 方法 接口 枚举 事件 //GetConstructor(), GetConstructors():返回ConstructorInfo类型,用于取得该类的构造函数的信息 //GetParameters(),获取参数列表 //GetEvent(), GetEvents():返回EventInfo类型,用于取得该类的事件的信息 //GetField(), GetFields():返回FieldInfo类型,用于取得该类的字段(成员变量)的信息 //GetInterface(), GetInterfaces():返回InterfaceInfo类型,用于取得该类实现的接口的信息 //GetMember(), GetMembers():返回MemberInfo类型,用于取得该类的所有成员的信息 //GetMethod(), GetMethods():返回MethodInfo类型,用于取得该类的方法的信息 //GetProperty(), GetProperties():返回PropertyInfo类型,用于取得该类的属性的信息 TestReflection testCase = new TestReflection(); testCase._name = "沙僧"; testCase.OnPush += Test; testCase.Isure("唐僧"); //根据程序集来获取程序集内的类型 Assembly testClassAssembly = Assembly.GetAssembly(typeof(TestReflection)); Type testClass = testClassAssembly.GetType("Reflection.TestReflection"); Console.WriteLine("******************GetConstructors,GetParameters******************"); //通过typeof获取指定类的信息 Type t = typeof(TestReflection); TestReflection obj = Activator.CreateInstance(t) as TestReflection;//根据获取到的类型来创建一个实例 ConstructorInfo[] count = t.GetConstructors(); //GetConstructors():返回ConstructorInfo类型,用于取得该类的构造函数的信息 foreach (var item in count) { //获取每个构造函数的参数列表 ParameterInfo[] paracount = item.GetParameters(); foreach (var itempara in paracount) { Console.WriteLine("参数:" + itempara.Name + " 参数类型:" + itempara.ParameterType); } } Console.WriteLine("******************GetField******************"); //获取TestReflection类的字段信息 FieldInfo _name = t.GetField("_name"); Console.WriteLine("name:" + _name.Name); Console.WriteLine("value:" + _name.GetValue(testCase));//获取值的前提是这个字段要赋值,是空的你去取值会报错 _name.SetValue(testCase, "1234"); Console.WriteLine("修改后的值:" + testCase._name); Console.WriteLine("******************GetProperty******************"); PropertyInfo[] GetPropertycount = t.GetProperties(); foreach (var item in GetPropertycount) { item.SetValue(testCase, "12345"); Console.WriteLine("属性:" + item.Name); Console.WriteLine(item.GetValue(testCase)); } Console.WriteLine("******************GetMembers******************"); MemberInfo[] GetMemberscount = t.GetMembers(); foreach (var item in GetMemberscount) { Console.WriteLine("成员信息:" + item.Name); } Console.WriteLine("******************GetMethod******************"); var GetMethodcount = t.GetMethod("TestFuncWithParam"); // foreach (var item in GetMethodcount) //{ Console.WriteLine("方法名:" + GetMethodcount.Name); var result = GetMethodcount.Invoke(obj, new object[] { "a", "b" });//调用并接受结果 obj.TestFuncWithParam("c","d");//经过强转可以直接调用 或者使用dynamic Console.WriteLine(result); var paraname = GetMethodcount.GetParameters();//获取参数列表 foreach (var para in paraname) { Console.WriteLine($"我是{GetMethodcount}的参数{para}"); } // } Console.ReadLine();
总结:反射是一种高级特性,在平时的编码似乎也不是经常用到,但在搭建框架时考虑到灵活性会使用反射,如:mvc的管道模型中想一想我们只传入了控制器名和方法,框架是如何找到对应的类和方法的呢,还有core里面的IOC,我们传入接口类和实现类,在构造注入时内部是怎样创建具体实例保存在容器中呢?这些都用了反射来实现。带来灵活性,同时也会损失一部分性能,因为其不是直接调用方法。
原文:https://www.cnblogs.com/wshnzxj/p/14033552.html