|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
竟发现没有太大的帮助。总觉得要用起来,感觉到不了位。因为公司机器的原因,一直没有安装vs.net(也从来没有用过)。以前做asp的时候一直用DW(感觉其代码联想功能不错),可现在到了asp.net却不习惯了。反射概述:
反射的界说:检察元数据并搜集关于它的范例信息的才能。元数据(编译今后的最基础数据单位)就是一年夜堆的表,当编译程序集大概模块时,编译器会创立一个类界说表,一个字段界说表,和一个办法界说表等。
System.reflection定名空间包括的几个类,同意你反射(剖析)这些元数据表的代码
System.Reflection.Assembly
System.Reflection.MemberInfo
System.Reflection.EventInfo
System.Reflection.FieldInfo
System.Reflection.MethodBase
System.Reflection.ConstructorInfo
System.Reflection.MethodInfo
System.Reflection.PropertyInfo
System.Type
以下是下面几个类的利用办法:
(1)利用Assembly界说和加载程序集,加载在程序集清单中列出模块,和今后程序会合查找范例并创立该范例的实例。
(2)利用Module懂得包括模块的程序集和模块中的类等,还能够猎取在模块上界说的一切全局办法或其他特定的非全局办法。
(3)利用ConstructorInfo懂得机关函数的称号、参数、会见润色符(如pulic或private)和完成具体信息(如abstract或virtual)等。利用Type的GetConstructors或GetConstructor办法来挪用特定的机关函数。
(4)利用MethodInfo懂得办法的称号、前往范例、参数、会见润色符(如pulic或private)和完成具体信息(如abstract或virtual)等。利用Type的GetMethods或GetMethod办法来挪用特定的办法。
(5)利用FiedInfo懂得字段的称号、会见润色符(如public或private)和完成具体信息(如static)等,并猎取或设置字段值。
(6)利用EventInfo懂得事务的称号、事务处置程序数据范例、自界说属性、声明范例和反射范例等,增加或移除事务处置程序。
(7)利用PropertyInfo懂得属性的称号、数据范例、声明范例、反射范例和只读或可写形态等,猎取或设置属性值。
(8)利用ParameterInfo懂得参数的称号、数据范例、是输出参数仍是输入参数,和参数在办法署名中的地位等。
反射的条理:
(注:条理间都是一对多的干系)
反射的感化:
1、可使用反射静态地创立范例的实例,将范例绑定到现有工具,或从现有工具中猎取范例
2、使用程序必要在运转时从某个特定的程序会合载进一个特定的范例,以便完成某个义务时能够用到反射。
3、反射次要使用与类库,这些类库必要晓得一个范例的界说,以便供应更多的功效。
使用要点:
1、实际使用程序中很少有使用程序必要利用反射范例
2、利用反射静态绑定必要就义功能
3、有些元数据信息是不克不及经由过程反射猎取的
4、某些反射范例是专门为那些clr开辟编译器的开辟利用的,以是你要意想到不是一切的反射范例都是合适每一个人的。
反射appDomain的程序集:
当你必要反射AppDomain中包括的一切程序集,示比方下:
staticvoidMain
{
//经由过程GetAssemblies挪用appDomain的一切程序集
foreach(AssemblyasseminAppdomain.currentDomain.GetAssemblies())
{
//反射以后程序集的信息
reflector.ReflectOnAssembly(assem)
}
}
申明:挪用AppDomain工具的GetAssemblies办法将前往一个由System.Reflection.Assembly元素构成的数组。
反射单个程序集:
下面的办法讲的是反射AppDomain的一切程序集,我们能够显现的挪用个中的一个程序集,system.reflecton.assembly范例供应了上面三种办法:
1、Load办法:尽力保举的一种办法,Load办法带有一个程序集标记并载进它,Load将引发CLR把战略使用到程序集上,前后在全局程序集缓冲区,使用程序基目次和公有路径上面查找该程序集,假如找不到该程序集体系抛出非常
2、LoadFrom办法:传送一个程序集文件的路径名(包含扩大名),CLR会载进您指定的这个程序集,传送的这个参数不克不及包括任何干于版本号的信息,地区性,和公钥信息,假如在指定路径找不到程序集抛出非常。
3、LoadWithPartialName:永久不要利用这个办法,由于使用程序不克不及断定再在载进的程序集的版本。该办法的独一用处是匡助那些在.Net框架的测试环节利用.net框架供应的某种举动的客户,这个办法将终极被丢弃不必。
注重:system.AppDomain也供应了一种Load办法,他和Assembly的静态Load办法纷歧样,AppDomain的load办法是一种实例办法,前往的是一个对程序集的援用,Assembly的静态Load方发将程序集按值封装发还给收回挪用的AppDomain.只管制止利用AppDomain的load办法
使用反射猎取范例信息:
后面讲完了关于程序集的反射,上面在讲一下反射条理模子中的第三个条理,范例反射
一个复杂的使用反射猎取范例信息的例子:
usingsystem;
usingsytem.reflection;
classreflecting
{
staticvoidMain(string[]args)
{
reflectingreflect=newreflecting();//界说一个新的本身类
//挪用一个reflecting.exe程序集
assemblymyAssembly=assembly.loadfrom(“reflecting.exe”)
reflect.getreflectioninfo(myAssembly);//猎取反射信息
}
//界说一个猎取反射内容的办法
voidgetreflectioninfo(assemblymyassembly)
{
type[]typearr=myassemby.Gettypes();//猎取范例
foreach(typetypeintypearr)//针对每一个范例猎取具体信息
{
//猎取范例的布局信息
constructorinfo[]myconstructors=type.GetConstructors;
//猎取范例的字段信息
fieldinfo[]myfields=type.GetFiedls()
//猎取办法信息
MethodInfomyMethodInfo=type.GetMethods();
//猎取属性信息
propertyInfo[]myproperties=type.GetProperties
//猎取事务信息
EventInfo[]Myevents=type.GetEvents;
}
}
}
别的几种猎取type工具的办法:
1、System.type参数为字符串范例,该字符串必需指定范例的完全称号(包含其定名空间)
2、System.type供应了两个实例办法:GetNestedType,GetNestedTypes
3、Syetem.Reflection.Assembly范例供应的实例办法是:GetType,GetTypes,GetExporedTypes
4、System.Reflection.Moudle供应了这些实例办法:GetType,GetTypes,FindTypes
设置反射范例的成员:
反射范例的成员就是反射条理模子中最上面的一层数据。我们能够经由过程type工具的GetMembers办法获得一个范例的成员。假如我们利用的是不带参数的GetMembers,它只前往该范例的大众界说的静态变量和实例成员,我们也能够经由过程利用带参数的GetMembers经由过程参数设置来前往指定的范例成员。详细参数参考msdn中system.reflection.bindingflags列举范例的具体申明。
比方:
//设置必要前往的范例的成员内容
bindingFlagsbf=bingdingFlags.DeclaredOnly|bingdingFlags.Nonpublic|BingdingFlags.Public;
foreach(MemberInfomiintt.getmembers(bf))
{
writeline(mi.membertype)//输入指定的范例成员
}
经由过程反射创立范例的实例:
经由过程反射能够猎取程序集的范例,我们就能够依据取得的程序集范例来创立该范例新的实例,这也是后面提到的在运转时创立工具完成晚绑定的功效
我们能够经由过程上面的几个办法完成:
1、System.Activator的CreateInstance办法。该办法前往新工具的援用。详细利用办法拜见msdn
2、System.Activator的createInstanceFrom与上一个办法相似,不外必要指定范例及其程序集
3、System.Appdomain的办法:createInstance,CreateInstanceAndUnwrap,CreateInstranceFrom和CreateInstraceFromAndUnwrap
4、System.type的InvokeMember实例办法:这个办法前往一个与传进参数符合的机关函数,并机关该范例。
5、System.reflection.constructinfo的Invoke实例办法
反射范例的接口:
假如你想要取得一个范例承继的一切接口汇合,能够挪用Type的FindInterfacesGetInterface大概GetInterfaces。一切这些办法只能前往该范例间接承继的接口,他们不会前往从一个接口承继上去的接口。要想前往接口的基本接口必需再次挪用上述办法。
反射的功能:
利用反射来挪用范例大概触发办法,大概会见一个字段大概属性时clr必要做更多的事情:校验参数,反省权限等等,以是速率长短常慢的。以是只管不要利用反射举行编程,关于盘算编写一个静态机关范例(晚绑定)的使用程序,能够接纳以下的几种体例举行取代:
1、经由过程类的承继干系。让该范例从一个编译时可知的基本范例派生出来,在运转时天生该范例的一个实例,将对其的援用放到其基本范例的一个变量中,然后挪用该基本范例的虚办法。
2、经由过程接话柄现。在运转时,构建该范例的一个实例,将对其的援用放到其接口范例的一个变量中,然后挪用该接口界说的虚办法。
3、经由过程托付完成。让该范例完成一个办法,其称号和原型都与一个在编译时就已知的托付符合。在运转时先机关该范例的实例,然后在用该办法的工具及称号机关出该托付的实例,接着经由过程托付挪用你想要的办法。这个办法绝对与后面两个办法所作的事情要多一些,效力更低一些。觉得J2EE好像有很多工具,比如servlet,jboss,tomcat,ejb什么的,可是微软的.NET怎么什么也没有啊? |
|