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

ASP.NET
asp.net css注释的影响
ASP.NET与数据库相关技巧
关于HtmlForm控件
三色交替的下拉列表框
精通ASP.NET中弹出窗口技术
ASP.NET Forums与现有系统整合方案示例
ASP.NET操作IIS中的虚拟目录
DataGrid与SQL Server 2000数据绑定
如何让Web应用程序在Client端实现导出报表功能
如何保证web app中的Send Email线程稳定性
关于用ASP.Net识别远程主机服务器种类
ASP.NET中上传下载文件
提高ASP.NET性能的方法
asp.net StreamReader 创建文件
asp.net如何生成图片验证码(简单)
一个.net 压缩位图至JPEG的代码
简单的SQL Server数据库数据读取与数据操作
获取网站的RSS聚合到自己的网页
.Net程序中整站通用的防SQL注入函数
asp.net生成缩略图及给原始图加水印的函数

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 98 ::
收藏到网摘: 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'