最新很全很好用的反射例子.docx
- 文档编号:27606883
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:22
- 大小:22.43KB
最新很全很好用的反射例子.docx
《最新很全很好用的反射例子.docx》由会员分享,可在线阅读,更多相关《最新很全很好用的反射例子.docx(22页珍藏版)》请在冰豆网上搜索。
最新很全很好用的反射例子
很全很好用的反射例子
反射帮助类
这个帮助类主要是用反射技术来实现的,既然说到反射那我们就来说说反射吧!
1、概念:
这是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:
'程序集(Assembly)’、'模块(Module)’、'类型(class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息,例如:
2、 通常程序员面试题,有这样关于反射的解释:
反射可以动态地创建类型的实例,还可以将类型绑定到现有对象,或从现有对象中获取类型。
然后,可以调用类型的方法或访问其字段和属性。
3、下面我们来说说反射中经常用到的几个类吧!
a)Assembly类可以获得正在运行的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类型的实例。
i.下面是关于Assembly类的例子
publicvoidAssemblyTest()
{
Console.WriteLine("----------------Assembly类的使用----------------");
Console.WriteLine();
//获取当前所执行代码的程序集信息
Assemblyassembly=Assembly.GetExecutingAssembly();
Console.WriteLine("获取程序集的位置:
"+assembly.CodeBase);
Console.WriteLine("获取程序集的入口点:
"+assembly.EntryPoint);
Console.WriteLine("获取程序集的显示名称:
"+assembly.FullName);
Console.WriteLine("获取包含当前程序集清单的模块:
"+assembly.ManifestModule);
Console.WriteLine();
//获取当前程序集的名称和信息
AssemblyNameassemblyName=assembly.GetName();
Console.WriteLine("获取或设置程序集的简单名称:
"+assemblyName.Name);
Console.WriteLine("获取程序集的名称:
"+assemblyName.FullName);
Console.WriteLine("获取或设置程序集的URL位置:
"+assemblyName.CodeBase);
Console.WriteLine("获取或设置程序集的主版本号、次版本号、内部版本号和修订版本号:
"+assemblyName.Version);
Console.WriteLine();
//获取当前程序集的版本相关信息
Versionversion=assemblyName.Version;
Console.WriteLine("获取当前程序集的主版本号:
"+version.Major);
Console.WriteLine("获取当前程序集的次版本号:
"+version.Minor);
Console.WriteLine("获取当前程序集的内部版本号:
"+version.Build);
Console.WriteLine("获取当前程序集的修订版本号:
"+version.MajorRevision);
Console.WriteLine();
}
ii.
b)Type类可以获得对象的类型信息,此信息包含对象的所有要素:
方法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调用之。
i.下面是关于Type类的例子:
publicvoidTypeTest()
{
Console.WriteLine("-----------------------Type类的使用-------------------------");
Console.WriteLine();
//设置被检索的类
TypemyType=Type.GetType("Demo.PersonClass");
//TypemyType=newPersonClass().GetType();
//检索信息
Console.WriteLine("获取当前成员名称:
"+myType.Name);
Console.WriteLine("获取当前完全限定名(不包括程序信):
"+myType.FullName);
Console.WriteLine("获取当前Type所在的够命名空间:
"+myType.Namespace);
Console.WriteLine();
//检索类成员
Console.WriteLine("获取方法相关信息:
"+myType.GetMethod("MetName").ToString());
Console.WriteLine("获取属性相关信息:
"+myType.GetProperty("Name").ToString());
Console.WriteLine("获取字段相关信息:
"+myType.GetField("name",BindingFlags.NonPublic|BindingFlags.Instance).ToString());
Console.WriteLine();
//设定自己为被检索的类
TypethisType=this.GetType();
}
c)访问类成员中的常用到的几个类:
///
///访问类成员±
///
publicvoidClassMemberInfo()
{
//指定被访问的类
//TypemyType=Type.GetType("Demo.PersonClass")
//或者这样指定被访问的类:
这样可以获取属性值但要用到对象实例,
PersonClassperson=newPersonClass();
TypepersonType=person.GetType();
Console.WriteLine("-----------MemberInfo访问类的所有成员----------");
Console.WriteLine();
//MemberInfo类:
遍历访问类中所有成员
MemberInfo[]memberInfo=personType.GetMembers(BindingFlags.Public|BindingFlags.NonPublic
|BindingFlags.Static|BindingFlags.Instance|BindingFlags.DeclaredOnly);
foreach(MemberInfominmemberInfo)
{
Console.WriteLine("成员名称:
{0}-----------成员类型:
{1}",m.Name,m.MemberType);
}
Console.WriteLine();
Console.WriteLine("--------------------------MethodInfo类访问类的方法-----------------------");
Console.WriteLine();
//MethodInfo类:
遍历被访问类的方法
MethodInfo[]methodInfo=personType.GetMethods(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.DeclaredOnly);
foreach(MethodInfominmethodInfo)
{
Console.WriteLine("方法名称:
{0}-----------方法类型:
{1},{2}",m.Name,m.ReturnType);
}
Console.WriteLine();
Console.WriteLine("------------------PropertyInfo类访问属性------------------");
Console.WriteLine();
//Propertyinfo类:
遍历被访问类的属性
PropertyInfo[]prop=personType.GetProperties(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.DeclaredOnly);
foreach(PropertyInfopinprop)
{
Console.WriteLine("属性名称:
{0}属性类型:
{1}属性值:
{2}",p.Name,p.PropertyType,p.GetValue(person,null));
}
Console.WriteLine();
Console.WriteLine("---------------------------FieldInfo类访问字段------------------------------");
Console.WriteLine();
//FieldInfo类:
遍历被访问类的字段
FieldInfo[]fieldInfo=personType.GetFields(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.DeclaredOnly);
foreach(FieldInfofinfieldInfo)
{
Console.WriteLine("字段名称:
{0}---------字段类型:
{1}",f.Name,f.FieldType);
}
Console.WriteLine();
Console.WriteLine("---------------ConstructorInfo类访问构造函数------------");
Console.WriteLine();
//ConstructorInfo类:
遍历被访问类的构造函数
ConstructorInfo[]constructor=personType.GetConstructors(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.DeclaredOnly);
foreach(ConstructorInfocinconstructor)
{
Console.WriteLine("构造函数名称:
{0}-------构造函数类型:
{1}",c.Name,c.MemberType);
}
Console.WriteLine();
Console.WriteLine("----------------EventInfo类访问类的事件元数据---------------");
Console.WriteLine();
//EventInfo类:
遍历被访问类的事件
EventInfo[]eventInfo=personType.GetEvents(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.DeclaredOnly);
foreach(EventInfoeineventInfo)
{
Console.WriteLine("事件名称:
{0}--------成员类型:
{1}",e.Name,e.MemberType);
}
Console.WriteLine();
Console.WriteLine("--------------ParameterInfo用于表示参数元数据-----------");
Console.WriteLine();
//ParameterInfo类:
检索PersonClass类中MetName()方法中的参数
MethodInfomethod=personType.GetMethod("TestName");//("TestName")为方法名
ParameterInfo[]para=method.GetParameters();
intcount=0;
foreach(ParameterInfopinpara)
{
count++;
Console.WriteLine("参数"+count+"名称:
{0},类型:
{1}",p.Name,p.ParameterType);
}
Console.WriteLine();
}
d)调用类成员
///
///调用类成员
///第一种调用方法就是用MethodInfo类调用方法,PropertyInfo类调用属性,FieldInfo类调用字段,EventInfo类调用事件,///ConstructorInfo类调用构造函数
///第二种方法就是用Type类的InvokeMember()方法
///
publicvoidOperMembers()
{
//指定被访问的类
PersonClasspersonClass=newPersonClass();
Typetype=personClass.GetType();
//或者这样指定被访问类(注意:
静态类时(“GetType(“命名空间.类名”)”))
//Typetype=Type.GetType("Demo.PersonClass");
//操作方法
string[]strName=newString[]{"我是谁"};//方法参数的值
MethodInfomethodInfo=type.GetMethod("MetName");//("MetName")是方法名
methodInfo.Invoke(personClass,strName);
Console.WriteLine("操作方法改变值后为:
"+personClass.Name);
//操作属性
PropertyInfoproperty=type.GetProperty("Name");//("Name")表示属性名
property.SetValue(personClass,"wxy",null);//"wxy"为新值SetValue为设置属性的值,GetValue为获取属性的值
Console.WriteLine("操作属性改变后的值为:
"+personClass.Name);
//操作字段
FieldInfofield=type.GetField("name",BindingFlags.NonPublic|BindingFlags.Instance);
field.SetValue(personClass,"hehe");//"hehe"表示给字段赋的新值
Console.WriteLine("操作字段改变后的值为:
"+field.Name);
Console.WriteLine();
//操作事件
EventInfoeventInfo=type.GetEvent("WMShout");//("WMShout")表示的是事件名
Console.WriteLine("声明该成员的类:
"+eventInfo.DeclaringType);
Console.WriteLine("事件名称:
"+eventInfo.Name);
Console.WriteLine("事件类型:
"+eventInfo.MemberType);
Console.WriteLine();
//操作构造函数
ConstructorInfoconstructor=type.GetConstructor(System.Type.EmptyTypes);
}
下面是我封装的一个Helper类,这个类主要用于一个对象给另一个对象赋值(就是一个对象中的属性或字段想要得到与另一个对象相同的值那么就可以可以用这封装的这个类):
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Reflection;
usingSystem.Collections;
usingSystem.IO;
namespaceReflectionDemo
{
publicclassReflectionHelper
{
///
///将一个对象中的属性值赋给对应的另一个对象中的属性
///
///
///
publicstaticvoidGetObjectAttributeAssignmentAnotherObject(objecttarget,objectinitial)
{
//获取被赋值对象的属性
PropertyInfo[]propertyInfo1=target.GetType().GetProperties(BindingFlags.Public|
BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.DeclaredOnly);
//获取赋值对象的属性
PropertyInfo[]propertyInfo2=initial.GetType().GetProperties(BindingFlags.Public|
BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.DeclaredOnly);
foreach(PropertyInfopropertyinpropertyInfo1)//遍历被赋值对象的属性
{
foreach(PropertyInfopinpropertyInfo2)//遍历赋值对象的属性
{
//判断被赋值对象与赋值对象中的属性名和属性类型都同那就赋值
if(property.Name==p.Name&&property.PropertyType==p.PropertyType&&property.CanWrite==true)
{
property.SetValue(target,p.GetValue(initial,null),null);//向对象设置值(SetValue为置,GetValue为获取)
}
}
}
}
///
///将一个对象中的属性值赋给对应的另一个对象中的属性
///
///
///
///
publicstaticvoidSetObjectAttributes(objecttarget,objectinitial,Hashtableht)
{
//获取被赋值对象的属性
PropertyInfo[]propertyInfo1=target.GetType().GetProperties(BindingFlags.Public|
BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.DeclaredOnly);
//获取赋值对象的属性
PropertyInfo[]propertyInfo2=initial.GetType().GetProperties(BindingFlags.Public|
BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.DeclaredOnly);
foreach(PropertyInfopropertyinpropertyInfo1)//遍历被赋值对象的属性
{
foreach(PropertyInfopinpropertyInfo2)//遍历赋值对象的属性
{
if(ht.Count>0)//保证Hashtable中有数据
{
if(ht[property.Name]!
=null)//判断Hashtable中的key值在Hashtable中是否能找到
{
if(ht[property.Name].Equals(p.Name))//判断两个对象中和的属性在Hashtable中是否是相对应
{
property.SetValue(target,p.GetValue(initial,null),null);//赋值(SetValue为设置值,GetValue取值)
continue;
}
}
}
//判断被赋值对象与赋值对象中的属性名和属性类型都相同那就赋值
if(property.Name==p.Na
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 很好 反射 例子