如何:提供关于组件的元数据说明
更新:2007 年 11 月
可以通过 attributes 提供关于组件的描述性元数据。属性是应用于代码元素的专用类。在编译时,属性被发送到元数据中,而这些元数据可通过 System.Reflection 命名空间用于公共语言运行库或用于自定义工具和应用程序。
属性附加到组件的方法是在组件的前面放置一个属性引用,并提供任何相关的参数或标志。此构造函数调用在 Visual Basic 中放在尖括号 <> 中,在 C# 中放在方括号 [] 中。
按照约定,所有属性类都以“Attribute”结尾。例如,DescriptionAttribute、ObsoleteAttribute 和 BrowsableAttribute 类。然而,若干以公共语言运行库为目标的语言(包括 Visual Basic 和 C#)不要求属性的全名。例如,ObsoleteAttribute 在代码中可以被称为 Obsolete。
将现有属性附加到组件
确定组件需要哪些属性。
将这些属性附加到组件。注意必须或者使用完全限定的属性名,或者添加适当的 Imports (using) 语句。下面的示例显示如何附加 DescriptionAttribute 属性:
Imports System.ComponentModel <Description("This is a description string")> Public Class TheClass End Class
using System.ComponentModel; [Description("This is a description string")] public class TheClass { }
自定义属性
还可以通过从 Attribute 继承来创建自己的要用于自定义工具或应用程序的属性。可以向这个基类中添加应用程序所需的任何自定义属性或方法。
创建并应用自定义属性
创建一个从 Attribute 继承的类。
Public Class WidgetAttribute Inherits System.Attribute End Class
public class WidgetAttribute: System.Attribute { }
确定属性需要哪些属性和方法并为它们编写代码。下面的示例显示如何创建一个 WidgetType 属性,该属性在 WidgetAttribute 类的构造函数中进行设置。AttributeUsageAttribute 属性设置属性能够以什么代码成员为目标。
<AttributeUsage(System.AttributeTargets.Class)> Public Class _ WidgetAttribute Inherits System.Attribute Private mWidgetType as WidgetTypeEnum ' Creates a readonly property for the WidgetAttribute class. Public ReadOnly Property WidgetType as WidgetTypeEnum Get Return mWidgetType End Get End Property ' Creates a constructor that accepts a parameter and assigns the ' value of that parameter to the WidgetType property. Public Sub New(type as WidgetTypeEnum) MyBase.New() mWidgetType = type End Sub End Class
[AttributeUsage(System.AttributeTargets.Class)] public class WidgetAttribute: System.Attribute { private WidgetTypeEnum widgetType; // Creates a readonly property for the WidgetAttribute class. public WidgetTypeEnum WidgetType { get {return widgetType;} } public WidgetAttribute(WidgetTypeEnum type): base() { widgetType = type; } }
像对待任何其他属性那样应用此属性,确保应用任何所需的参数。
<WidgetAttribute(WidgetTypeEnum.VerticalWidget)> _ Public Class WidgetFortyFive End Class
[WidgetAttribute(WidgetTypeEnum.VerticalWidget)] public class WidgetFortyFive { }