`
guoyiqi
  • 浏览: 1002000 次
社区版块
存档分类
最新评论

C#编写自定义特性(Attribute)详解(转自:http://www.csharpwin.com/csharpspace/9349r9836.shtml)

 
阅读更多

  • 摘要:本文介绍C#编写自定义特性(Attribute),自定义属性本质上是直接或间接地从 System.Attribute 派生的传统类。与传统类一样,自定义属性也包含存储和检索数据的方法。

要设计自己的自定义属性,不必掌握许多新的概念。如果熟悉面向对象的编程,并且知道如何设计类,就已具备了所需的大部分知识。自定义属性本质上是直接或间接地从System.Attribute派生的传统类。与传统类一样,自定义属性也包含存储和检索数据的方法。

正确设计自定义属性类的主要步骤如下:

  • 应用 AttributeUsageAttribute

  • 声明属性类

  • 声明构造函数

  • 声明属性

本节描述上述每个步骤,并以自定义属性示例结束。

应用 AttributeUsageAttribute

自定义属性声明以AttributeUsageAttribute开始,而该属性定义属性类的一些主要属性。例如,可指定属性是否可被其他类继承,或指定属性可应用到哪些元素。下列代码段说明了如何使用AttributeUsageAttribute

[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]

System.AttributeUsageAttribute 类包含三个对自定义属性的创建具有重要意义的成员:AttributeTargets、Inherited 和 AllowMultiple。

AttributeTargets 成员

在前面的示例中指定了AttributeTargets.All,指示该属性可以应用到所有程序元素。还可以指定AttributeTargets.Class,指示属性只可以应用于某个类;或指定AttributeTargets.Method,指示属性只可以应用于某个方法。所有程序元素都可通过这种方式由自定义属性标记,以便对其进行描述。

还可传递AttributeTargets的多个实例。下列代码段指定自定义属性可应用到任何类或方法。

[AttributeUsage (AttributeTargets.Class | AttributeTargets.Method)]

继承属性

Inherited属性指示属性是否可由从该属性应用到的类派生的类继承。该属性采用true(默认值)或false标志。例如,在下面的代码示例中,MyAttribute的默认Inherited值为true,而YourAttributeInherited值为false

//This defaults to Inherited = true.
public class MyAttribute :Attribute
{
}

[AttributeUsage( Inherited
= false)]
public class YourAttribute : Attribute
{
}
然后,这两个属性应用到基类MyClass中的某个方法。
public class MyClass
{
[MyAttribute]
[YourAttribute]
public virtual void MyMethod()
{
//...
}
}
最后,YourClass类从基类MyClass继承。方法MyMethod显示MyAttribute,而不是YourAttribute
public class YourClass: MyClass
{
//MyMethod will have MyAttribute but not YourAttribute.
public override void MyMethod()
{
//...
}

}

AllowMultiple 属性

AllowMultiple属性指示元素中是否可存在属性的多个实例。如果设置为true,则允许存在多个实例;如果设置为false(默认值),则只允许存在一个实例。

在下面的代码示例中,MyAttribute的默认AllowMultiple值为false,而YourAttribute的对应值为true

//This defaults to AllowMultiple = false.
public class MyAttribute :Attribute
{
}

[AttributeUsage(AllowMultiple
= true)]
public class YourAttribute : Attribute
{
}
当应用这些属性的多个实例时,MyAttribute将生成编译器错误。下面的代码示例显示YourAttribute的有效用法和MyAttribute的无效用法。
public class MyClass
{
//This produces an error.
//Duplicates are not allowed.
[MyAttribute]
[MyAttribute]
public void MyMethod() {
//...
}

//This is valid.
[YourAttribute]
[YourAttribute]
public void YourMethod(){
//...
}
}

如果AllowMultiple属性和Inherited属性都设置为true,则从另一个类继承的类可以继承一个属性,并在同一子类中应用同一属性的另一个实例。如果AllowMultiple设置为false,则父类中的所有属性值将被子类中同一属性的新实例重写。

声明属性类

应用了AttributeUsageAttribute后,可以开始定义属性细节。属性类的声明与传统类的声明类似,如下列代码所示:

public class MyAttribute : System.Attribute
{
// . . .
}

此属性定义说明了下列几点:

  • 属性类必须声明为公共类。

  • 按照约定,属性类的名称以单词Attribute结尾。虽然并不要求这样,但出于可读性目的,建议采用此约定。应用属性时,可以选择是否包含 Attribute 一词。

  • 所有属性类都必须直接或间接地从System.Attribute继承。

  • 在 Microsoft Visual Basic 中,所有自定义属性类都必须具有 AttributeUsageAttribute 属性。

声明构造函数

用构造函数初始化属性的方法与对待传统类的方法相同。下列代码段阐释了典型的属性构造函数。该公共构造函数采用一个参数,并将其值设置为与成员变量相等。

public MyAttribute(bool myvalue)
{
this.myvalue = myvalue;
}

可重载该构造函数以适应值的不同组合。如果同时为自定义属性类定义了属性,则在初始化属性时可使用命名参数和定位参数的组合。通常情况下,将所有必选参数定义为定位参数,将所有可选参数定义为命名参数。在这种情况下,如果没有必选参数,则无法初始化属性。其他所有参数都是可选参数。请注意,在 Visual Basic 中,属性类的构造函数不应使用 ParamArray 参数。

下面的代码示例显示如何使用可选参数和必选参数应用使用上例中的构造函数的属性。它假定该属性有一个必选布尔值和一个可选字符串属性。

//One required (positional) and one optional (named) parameter are applied.
[MyAttribute(false, OptionalParameter = "optional data")]
//One required (positional) parameter is applied.
[MyAttribute(false)]

声明属性

如果需要定义命名参数,或者要提供一种容易的方法来返回由属性存储的值,请声明属性。应将属性属性声明为带有要返回的数据类型说明的公共实体。定义将保存属性值的变量,并将该变量与get方法和set方法关联。下面的代码示例说明如何在属性中实现一个简单的属性。

public bool MyProperty
{
get {return this.myvalue;}
set {this.myvalue = value;}
}

自定义属性示例

本节具体表现前面的信息,并显示如何设计一个简单的属性来记录有关代码段作者的信息。该示例中的属性存储程序员的名字和级别,和关于该代码是否已被复查过的信息。该示例使用三个私有变量存储要保存的实际值。每个变量用获取和设置这些值的公共属性表示。最后,用两个必选参数定义构造函数。

[AttributeUsage(AttributeTargets.All)]
public class DeveloperAttribute : System.Attribute
{

//Private fields.
private string name;
private string level;
private bool reviewed;

//This constructor defines two required parameters: name and level.

public DeveloperAttribute(string name,string level)
{
this.name = name;
this.level = level;
this.reviewed = false;
}

//Define Name property.
//This is a read-only attribute.

public virtual string Name
{
get {return name;}
}

//Define Level property.
//This is a read-only attribute.

public virtual string Level
{
get {return level;}
}

//Define Reviewed property.
//This is a read/write attribute.

public virtual bool Reviewed
{
get {return reviewed;}
set {reviewed = value;}
}
}

可通过下列方法之一,使用全名DeveloperAttribute或使用缩写名Developer来应用该属性。

[Developer("Joan Smith", "1")]
[Developer(
"Joan Smith", "1", Reviewed = true)]
第一个示例显示只用必选命名参数应用的属性,而第二个示例显示同时使用必选参数和可选参数应用的属性。

分享到:
评论

相关推荐

    http://www.w3.org/TR/html4/loose.dtd

    for presentation attribute and elements is required. HTML 4 includes mechanisms for style sheets, scripting, embedding objects, improved support for right to left and mixed direction text, ...

    C# 自定义特性

    在C#编程语言中,特性(Attribute)是一种元数据,它可以提供附加信息到代码的不同元素,如类、方法、属性等。这些元数据在编译时不会直接影响代码的行为,但可以在运行时通过反射机制被程序读取和使用,从而实现...

    交通预测模型合集:STGCN、DCRNN、ASTGCN、Graph wavenet、STGNN、STSGCN、STFGNN

    所涉及的交通预测相关的模型,其原文章。注:仅学习使用哈~主要包含的模型:STGCN、DCRNN、ASTGCN、Graph wavenet、STGNN、STSGCN、STFGNN。 模型所在的文章分析链接:(注:下述链接预计在2025年发布) ...

    c# 自定义特性demo

    在C#编程语言中,特性(Attribute)是一种元数据,它可以提供有关代码的附加信息,这些信息可以在编译时或运行时被程序访问。自定义特性允许开发人员为类、方法、属性等创建自己的元数据标记,从而实现特定的功能或...

    dubbo.xsd阿里巴巴开源xsd文件

    <?xml version="1.0" encoding="UTF-8" standalone="no"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:beans="http://www.springframework.org/schema/beans"... <xsd:attribute name=

    C#特性Attribute的实际应用之:为应用程序提供多个版本

    在.NET框架中,C#的特性(Attribute)是一种元数据,可以附加到代码的各种元素上,如类、方法、属性等,以提供额外的信息。这些信息可以在运行时被反射机制读取,从而实现各种功能。在标题“C#特性Attribute的实际...

    JSP标签,采用web.xml引入标签库描述文件

    本文将深入探讨JSP标签,特别是自定义标签,并解释如何通过`web.xml`配置文件来引入标签库描述文件,以便在JSP页面中使用这些标签。 首先,JSP标准标签库(JSTL)是一套预定义的标签,用于处理常见的任务,如迭代、...

    AAPT: error: resource attr/** (aka com.**.app:attr/**) not found.

    问题记录 记录项目中的一个问题,不知什么时候,运行项目会出现这个错误: 解决方法 buildscript { repositories { google() jcenter() } dependencies { //之前使用的是3.5.2版本,升级成3.6.2后就出现了...

    最新android蓝牙BLE代码

    - **GATT(Generic Attribute Profile)**:BLE的核心协议,定义了服务、特性、描述符的结构,是设备间进行数据交换的基础。 - **主设备与从设备**:在BLE中,手机通常作为主设备,搜索并连接到从设备(如智能手环...

    .net中Attribute、TypeConverter、UITypeEditor的自定义--.net自定义控件属性特性配置及相关类的设计

    3、例子中实现了一个自定义的Attribute:DisplayNameAttribute和一个自定一个TypeConverter:EnumConverter,以支持显示的值与实际选中的值可以不同并一一对应。 注意,各个属性均是自己定义的一个枚举类型...

    spring自定义标签

    在Spring框架中,自定义标签是一项非常实用的功能,它允许我们根据项目需求创建自己的XML配置元素,提升代码的可读性和可维护性。本篇将深入探讨如何扩展Spring,实现自定义标签,包括schema配置、自定义标签的定义...

    c#自定义特性

    ### C#自定义特性详解 #### 一、概述 C#中的自定义特性(Custom Attributes)是一种非常强大的机制,它允许开发人员将元数据(即有关代码的信息)附加到程序的各个部分,如类、方法、属性等。通过这种方式,可以在...

    离散化方法:Class-Attribute Contingency Coefficient (CACC - MATLAB):CACC离散化方法的正确实现。http://cs.adelaide.edu.au/~jzaragoza-matlab开发

    这是 Tsai 等人在 2008 年发表的论文“A Discretization Algorithm Based on Class-Attribute Contingency Coefficient”中出现的离散化方法的正确 MATLAB 实现。 如果您尝试了其他一些实现,但没有收到论文中报告...

    net c# 自定义特性并获取特性内的值

    在.NET框架中,C#语言提供了特性(Attribute)这一特性,允许我们在代码中添加元数据,这些元数据可以在运行时通过反射(Reflection)来访问。本项目“net c# 自定义特性并获取特性内的值”显然是一个关于如何创建...

    一步步写嵌入式操作系统.zip

    编译错误2: gcc -g -O2 -o skyeye skyeye.o ./utils/libutils.a ./arch/arm/libarm.a ./device/libdev.a ./arch/mips/libmips.a ./arch/ppc/libppc.a ./arch/bfin/libbfin.a ./arch/mips/libmips.a ./arch/coldfire...

    问题解决:ImportError: No module named paddle.v2

    问题描述 在使用paddlepaddle进行深度学习过程中需要导入Ploter from paddle.v2.plot import Ploter 但出现问题: Traceback (most recent call last): File D:/xxx.py, line 13, in from paddle.v2.plot import...

    C#自定义特性.pdf

    C#自定义特性Attribute C#中的自定义特性Attribute是将预定义的系统信息或用户定义的自定义信息与目标元素相关联的一种机制。目标元素可以是程序集、类、构造函数、委托、枚举、事件、字段、接口、方法、可移植可...

    ASP.NET MVC5 新特性:Attribute路由使用详解

    ### ASP.NET MVC5 新特性:Attribute路由使用详解 #### 一、Attribute路由简介与启用 在探讨Attribute路由之前,我们先来明确一下它的定义。**Attribute路由**是一种新的路由机制,它允许开发者直接在控制器的方法...

    c#中的特性(attribute)+反射的一个例子

    在C#编程语言中,特性(Attribute)是一种元数据,它可以提供有关代码的附加信息,这些信息可以在编译时或运行时被程序访问。特性允许程序员向类、方法、属性等添加自定义标记,以便在后期处理中进行特定操作。另一...

Global site tag (gtag.js) - Google Analytics