您的位置 首页 > 德语词汇

reflection是什么意思,Reflection

本篇文章给大家谈谈reflection是什么意思,以及Reflection对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

reflection是什么意思,Reflection

反射是很多框架都用到的东西,是从0.25到0.5的一个进阶

反射可以动态创建对象,动态赋值,动态调用方法

每个类都有一个type对象,构造方法对应的是ConstructorInfo对象,方法对应的是MethodInfo对象,字段对应的是FieldInfo对象,属性对应的是PropertyInfo对象,使用时需要引用usingSystem.Reflection;

classDog:Animal\n{\npublicstringname;\npublicintage;\ndoubleprice;\nstaticdoubleweight;\npublicDog(){}\npublicDog(stringname){}\npublicDog(stringname,intage){}\n\npublicoverridevoidSay(){}\n\npublicdoublePrice{get;set;}\npublicdoubleWeight{get;set;}\n}\n\nclassAnimal\n{\npublicvirtualvoidSay(){}\n}\n\nclassPrint\n{\nstaticvoidMain()\n{\nDogdog=newDog();\n\n//获取类的type对象常用的三种方式\nTypetype=typeof(Dog);\nTypetype1=dog.GetType();\nTypetype2=Type.GetType("Application.Dog");\n\n//假设只知道类的名字,利用类名创建对象实例\nTypet=typeof(Dog);\n//Activator.CreateInstance(t);被实例化的对象必须有无参构造方法,没有则会抛出MissingMethodException缺失方法异常\nobjectdog1=Activator.CreateInstance(t);//相当于newDog();,由于返回的是object,所以只能用object接收\n\nConsole.WriteLine(dog1);\nConsole.WriteLine(t.BaseType);//获取父类\nConsole.WriteLine(t.Name);//获取类名\nConsole.WriteLine(t.FullName);//获取全名,包含命名空间\nConsole.WriteLine(t.IsAbstract);//判断是否为抽象类\nConsole.WriteLine(t.IsArray);//是否为数组\nConsole.WriteLine(t.IsClass);//是否为普通类\nConsole.WriteLine(t.IsEnum);//是否为枚举\nConsole.WriteLine(t.IsPublic);//是否为public\nConsole.WriteLine(t.IsValueType);//是否为值类型\nConsole.WriteLine("------------*构造方法*---------------");\n\n//获取无参构造方法t.GetConstructor(newType[0]);参数要求是type对象数组,因此无参构造就只需要入参长度为0的数组就好了\nConstructorInfoc1=t.GetConstructor(newType[0]);\nConsole.WriteLine(c1);//Void.ctorctor是IL里面构造方法的表现方式\n\n//获取参数类型为string的构造方法\nc1=t.GetConstructor(newType[]{typeof(string)});\nConsole.WriteLine(c1);\n\n//获取参数类型为string,int的构造方法\nc1=t.GetConstructor(newType[]{typeof(string),typeof(int)});\nConsole.WriteLine(c1);\nConsole.WriteLine("------------*字段*---------------");\n\n//获取所有字段,必须是public,获取的是未封装的字段\nFieldInfo[]f1=t.GetFields();\nforeach(varfieldinf1)\n{\nConsole.WriteLine(field);\n}\n\n//获取非public,且非static的字段,如果需要获取static的,把Instance改成static\nf1=t.GetFields(BindingFlags.NonPublic|BindingFlags.Instance);\nforeach(varfieldinf1)\n{\nConsole.WriteLine(field);\n}\nConsole.WriteLine("------------*方法*---------------");\n\n//获得所有方法\nMethodInfo[]m1=t.GetMethods();\nforeach(varmethodinm1)\n{\nConsole.WriteLine(method);\n}\n//获得指定方法\n//注:如果方法有重载,则抛出AmbiguousMatchException\nMethodInfom2=t.GetMethod("Say");\nConsole.WriteLine("\\n"+m2);\n//解决方法抛出AmbiguousMatchException异常\nm2=t.GetMethod("Say",newType[0]);//获取无参方法\nm2=t.GetMethod("Say",newType[]{typeof(string)});//获取参数为string的方法\nConsole.WriteLine("------------*属性*---------------");\n\n//获得属性,获取到的是封装过的属性\nPropertyInfo[]prop=t.GetProperties();\nforeach(varpinprop)\n{\nConsole.WriteLine(p);\n}\n\t}\n}

输出:

Application.Dog\nApplication.Animal\nDog\nApplication.Dog\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\n------------*构造方法*---------------\nVoid.ctor()\nVoid.ctor(System.String)\nVoid.ctor(System.String,Int32)\n------------*字段*---------------\nSystem.Stringname\nSystem.Int32age\nSystem.Doubleprice\nSystem.Double<Price>k__BackingField\nSystem.Double<Weight>k__BackingField\n------------*方法*---------------\nVoidSay()\nDoubleget_Price()\nVoidset_Price(Double)\nDoubleget_Weight()\nVoidset_Weight(Double)\nBooleanEquals(System.Object)\nInt32GetHashCode()\nSystem.TypeGetType()\nSystem.StringToString()\n\nVoidSay()\n------------*属性*---------------\nDoublePrice\nDoubleWeight反射示例1

classDog\n{\npublicstringname;\n\npublicvoidSay(){Console.WriteLine("你好,"+Name);}\npublicvoidSay(stringname){Console.WriteLine($"你好,{name}");}\npublicstringName{get;set;}\n}\n\nclassPrint\n{\n//反射示例\nstaticvoidMain()\n{\n//创建对象\nTypet=typeof(Dog);\nobjectobj=Activator.CreateInstance(t);//创建对象,调用无参构造(方法1)\nobjectobj1=t.GetConstructor(newType[0]).Invoke(newobject[0]);//获得对象的无参构造,调用(方法2)\n\n//给属性赋值\nPropertyInfoprop=t.GetProperty("Name");//获得属性\nprop.SetValue(obj,"大宝");//赋值\n\n//调用方法\nMethodInfomethod=t.GetMethod("Say",newType[0]);//获得无参方法\nMethodInfomethod1=t.GetMethod("Say",newType[]{typeof(string)});//获得有参方法\n\nmethod.Invoke(obj,newobject[0]);//调用无参方法\nmethod1.Invoke(obj,newobject[]{"Tom"});//调用有参方法并赋值\n}\n}

输出:

你好,大宝\n你好,Tom反射示例2

classDog\n{\npublicstringname;\n\npublicvoidSay(){Console.WriteLine("你好,"+Name);}\npublicvoidSay(stringname){Console.WriteLine($"你好,{name}");}\npublicstringName{get;set;}\n}\nclassPrint\n{\nstaticvoidMain()\n{\nDogdog=newDog();\ndog.Name="Tom";\nShow(dog);\n}\n\nstaticvoidShow(objectobj)\n{\nTypet=obj.GetType();\n\nPropertyInfo[]prop=t.GetProperties();\nforeach(varpinprop)\n{\nif(p.CanRead)\n{\nstringname=p.Name;\nobjectvalue=p.GetValue(obj);\nConsole.WriteLine(name+"="+value);\n}\n}\n}\n}

输出:

Name=Tom反射示例3(复制对象的值)(浅拷贝--仅复制对象的值,不是同一个对象)

classDog\n{\npublicstringname;\n\npublicstringName{get;set;}\n}\nclassPrint\n{\nstaticvoidMain()\n{\nDogdog=newDog();\ndog.Name="Tom";\nobjectdog1=Clone(dog);\nConsole.WriteLine(object.ReferenceEquals(dog,dog1));//判断是否为同一个对象\n}\n\nstaticobjectClone(objectobj)\n{\nTypet=obj.GetType();\nobjectnewObject=Activator.CreateInstance(t);//创建对象\n\nPropertyInfo[]prop=t.GetProperties();\nforeach(varpinprop)\n{\nif(p.CanRead&&p.CanWrite)\n{\nobjectvalue=p.GetValue(obj);\np.SetValue(newObject,value);\n}\n}\nreturnnewObject;\n}\n}

输出:

好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023