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

ASP.NET
给Asp.Net初学者的关于继承和多态性的例子
新手入门:C++下的引用类型
初学者的福音:游戏开发新手入门指南
C/C++中利用空指针简化代码,提高效率
获取转向地址的URL的源文件(可自定义REFER)
asp.net中执行存储数据操作时数据被自动截取的一种情况
.NET中防止Access数据库下载
vs.Net2003无法打开或创建Web应用程序若干解决办法.
我今天开始正式学习.net遇到的问题
无法在Web服务器上启动调试。未将项目配置为进行调试
找不到类型或命名空间名称“Server”(是否缺少 using 指令或程序集引用?)
ASP.NET页面间的传值的几种方法
几个ASP.NET技巧
让Asp.NET的DataGrid可排序、可选择、可分页
web.config文件的中文解释
用DataReader还是DataSet?
ASP.NET中数据库操作初步
ExecuteReader(),ExecuteNonQuery(),ExecuteScalar(),ExecuteXmlReader()之间的区别
如何在DataGrid控件中实现自定义分页
ADO.NET 的最佳实践技巧

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


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