当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 在.NET运行时了解类型信息(3)

ASP.NET
asp.net Server.MapPath方法注意事项
asp.net下常用的加密算法MD5、SHA-1应用代码
几个 ASP.NET 小技巧
ASP.NET内置对象之Application对象
ASP.NET使用正则表达式屏蔽垃圾信息
asp.net“服务器应用程序不可用” 解决方法
asp.net Linq把数据导出到Excel的代码
asp.net ext treepanel 动态加载XML的实现方法
silverlight2.0Beta版TextBox输入中文解决方法
asp.net转出json格式客户端显示时间
asp.net下Linq To Sql注意事项小结
ASP.NET动态加载用户控件的实现方法
asp.net web大文件上传带进度条实例代码
asp.net DZ论坛中根据IP地址取得所在地的代码
向asp.Net进发 数据库连接操作
.net 上传文件前所未有的简单
asp.net gridview代码绑定
asp.net中List的使用方法
Asp.net(C#)实现验证码功能代码
asp.NET开发中正则表达式中BUG分析

ASP.NET 中的 在.NET运行时了解类型信息(3)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 275 ::
收藏到网摘: n/a

访问自定义属性当属性与程序元素相关联后,可以使用反射来查询它们是否存在以及它们的值。用于查询属性的主要反射方法包含在 System.Reflection.MemberInfo.GetCustomAttributes 和 System.Reflection.Assembly.GetCustomAttributes 中。 自定义属性的可访问性根据附加该属性的程序集来进行检查。这相当于检查附加自定义属性的程序集中的类型上的方法是否可以调用自定义属性的构造函数。 诸如 System.Reflection.Assembly.GetCustomAttributes(Type, Boolean) 等方法检查类型参数的可见性和可访问性。只有包含用户定义类型的程序集中的代码才能使用 GetCustomAttributes 检索该类型的自定义属性。 以下代码示例是典型的自定义属性设计模式。它说明运行库自定义属性反射模型。[C#]System.DLLpublic class DescriptionAttribute : Attribute{} System.Web.DLL internal class MyDescriptionAttribute : DescriptionAttribute { } public class LocalizationExtenderProvider { [MyDescriptionAttribute(...)] public CultureInfo GetLanguage(...) { }}如果试图为附加到 GetLanguage 方法的公共自定义属性类型 DescriptionAttribute 检索自定义属性,运行库将执行以下操作: 运行库检查 Type.GetCustomAttributes(Type type) 的 DescriptionAttribute 类型参数是否为公共的,并检查其是否可见或可以访问。 运行库检查从 DescriptionAttribute 导出的用户定义类型 MyDescriptionAttribute 在 System.Web.DLL 程序集(它在该程序集中附加到 GetLanguage() 方法)内是否可见和可以访问。 运行库检查 MyDescriptionAttribute 的构造函数是否在 System.Web.DLL 程序集中可见和可以访问。 运行库调用带有自定义属性参数的 MyDescriptionAttribute 的构造函数,然后将新对象返回给调用方。 自定义属性反射模型可能会在定义类型的程序集外泄漏用户定义类型的实例。这与运行库系统库中返回用户定义类型的实例的成员(例如返回 RuntimeMethodInfo 对象数组的 Type.GetMethods())相同。为了防止客户端发现关于用户定义的自定义属性类型的信息,请将该类型的成员定义为非公共成员。以下代码示例说明使用反射访问自定义属性的基本方法。 [C#]class MainClass { public static void Main() { System.Reflection.MemberInfo info = typeof(MyClass); object[] attributes = info.GetCustomAttributes(); for (int i = 0; i < attributes.Length; i ++) { System.Console.WriteLine(attributes[i]); } }}指定完全限定的类型名称要为各种反射操作提供有效的输入,必须指定类型名称。完全限定的类型名称包含程序集名称指定、命名空间指定和类型名称。类型名称指定将由 Type.GetType、Module.GetType、ModuleBuilder.GetType 和 Assembly.GetType 来使用。类型名称的 Backus-Naur 形式语法Backus-Naur 形式 (BNF) 定义正式语言的语法。下表中的 BNF 词法规则将说明如何识别有效的输入。最终元素(无法再减小的元素)将全部以大写字母显示。非最终元素(可以再减小的元素)则显示为大小写混合或带单引号的字符串,但单引号 (') 不是语法本身的一部分。管道字符 (|) 表示具有子规则的规则。完全限定类型名称的 BNF 语法TypeSpec := ReferenceTypeSpec | SimpleTypeSpecReferenceTypeSpec := SimpleTypeSpec '&'SimpleTypeSpec := PointerTypeSpec | ArrayTypeSpec | TypeNamePointerTypeSpec := SimpleTypeSpec '*'ArrayTypeSpec := SimpleTypeSpec '[ReflectionDimension]' | SimpleTypeSpec '[ReflectionEmitDimension]'ReflectionDimension := '*' | ReflectionDimension ',' ReflectionDimension | NOTOKENReflectionEmitDimension := '*' | Number '..' Number | Number '...' | ReflectionDimension ',' ReflectionDimension | NOTOKENNumber := [0-9]+TypeName := NamespaceTypeName | NamespaceTypeName ',' AssemblyNameSpecNamespaceTypeName := NestedTypeName | NamespaceSpec '.'NestedTypeNameNestedTypeName := IDENTIFIER | NestedTypeName '+' IDENTIFIERNamespaceSpec := IDENTIFIER | NamespaceSpec '.'IDENTIFIERAssemblyNameSpec := IDENTIFIER | IDENTIFIER ',' AssemblyPropertiesAssemblyProperties := AssemblyProperty | AssemblyProperties ',' AssemblyPropertyAssemblyProperty := AssemblyPropertyName '=' AssemblyPropertyValue指定特殊字符在 TypeName 中,IDENTIFIER 是由语言规则所确定的任何有效名称。反斜杠 (\) 可用作转义符来分隔以下用作 IDENTIFIER 一部分的标记。标记含义\,程序集分隔符。\+嵌套类型分隔符。\&引用类型。\*指针类型。\[数组维度分隔符。\]数组维度分隔符。\.只有在数组指定中使用句点时,才应在句点前使用反斜杠。NamespaceSpec 中的句点不采用反斜杠。\\用作字符串的反斜杠。请注意,在除 AssemblyNameSpec 之外的所有 TypeSpec 组成部分中,空格都是相关的。在 AssemblyNameSpe'