首页 > 编程语言 >C# 特性标签(Attribute)

C# 特性标签(Attribute)

时间:2023-03-07 13:23:47浏览次数:45  
标签:C# Attribute System 特性 private 标签 序列化 属性

C# 特性标签(Attribute)

公共语言运行时使你能够添加类似于关键字的描述性声明(称为特性),以便批注编程元素(如类型、字段、方法和属性)。 .NET 出于多种原因且为解决许多问题而使用特性。 特性描述如何将数据序列化、指定用于强制安全性的特征并限制通过实时 (JIT) 编译器进行优化,从而使代码易于调试。 特性还可记录文件的名称或代码的作者,或控制窗体开发过程中控件和成员的可见性。

 

1、特性(Attribute)

 使用特性,可以有效地将元数据或声明性信息与代码(程序集、类型、方法、属性等)相关联。 将特性与程序实体相关联后,可以在运行时使用 反射 这项技术查询特性。

特性具有以下属性:

1)特性向程序添加元数据。 元数据 是程序中定义的类型的相关信息。 所有 .NET 程序集都包含一组指定的元数据,用于描述程序集中定义的类型和类型成员。 可以添加自定义特性来指定所需的其他任何信息。

2)可以将一个或多个特性应用于整个程序集、模块或较小的程序元素(如类和属性)。

3)特性可以像方法和属性一样接受自变量。

4)程序可使用反射来检查自己的元数据或其他程序中的元数据。

使用特性(Attribute):

可以将特性附加到几乎任何声明中,尽管特定特性可能会限制可有效附加到的声明的类型。 在 C# 中,通过用方括号 ([]) 将特性名称括起来,并置于应用该特性的实体的声明上方以指定特性。

例如,

[Serializable]
public class SampleClass
{
      private string code = "csharp";
      private string name = "cjavapy";
      private int age = 0; 
}

2、常用特性标签(Attribute)

1)控件开发常用Attribute

BrowsableAttribute :描述是否一个属性或事件应该被显示在属性浏览器里。

CategoryAttribute :描述一个属性或事件的类别,当使用类别的时候,属性浏览器按类别将属性分组。

DescriptionAttribute :当用户在属性浏览器里选择属性的时候,description里指定的文本会显示在属性浏览器的下边,向用户显示属性的功能。

BindableAttribute :描述是否一个属性倾向于被绑定。

DefaultPropertyAttribute :为组件指定一个默认的属性,当用户在Form设计器上选择一个控件的时候,默认属性会在属性浏览器里被选中。   

DefaultValueAttribute :为一个简单类型的属性设置一个默认值。

EditorAttribute :为属性指定一个特殊的编辑器。

LocalizableAttribute :指示一个属性是否能被本地化,任何有这个Attribute的属性将会被持久化到资源文件里。 

DesignerSerializationVisibilityAttribute:指示一个属性是否或者如何持久化到代码里。

指示一个属性是否串行化和如何串行化,它的值是一个枚举,一共有三种类型Content,Hidden,Visible。Content指示代码生成器为对象包 含 的内容生成代码,而不是为对象本身,Hidden指示代码生成器不为对象生成代码,visible指示代码生成器为对象生成代码。假如你的控件 有一 个集合属性,又想在设计时自动将集合属性的内容生成代码,那么就使用这个Attribute,并将值设为DesignerSerializationVisibility.Content。

TypeConverterAttribute :为属性指定一个类型转换器,类型转换器能将属性的值转化成其它的数据类型。

DefaultEventAttribute :为组件指定一个默认的事件,当用户在form设计其中选择一个控件的时候,在属性浏览器中这个事件被选中。

2) Web services常用Attribute

WebMethodAttribute:向使用 ASP.NET 创建的 XML Web service 中的某个方法添加此特性后,就可以从远程 Web 客户端调用该方法。 此类不能被继承。

WebServiceAttribute:用于向 XML Web services 添加附加信息,如描述其功能的字符串。

WebServiceBindingAttribute:声明用于定义一个或多个 XML Web service 方法的绑定。 此类不能被继承。

3)调用非托管代码Attribute

DllImportAttribute:指示由非托管动态链接库 (DLL) 公开为静态入口点的特性化方法。

4)类和方法常用Attribute

ObsoleteAttribute:标记不再使用的程序元素。 此类不能被继承。一般标记不推荐使用的方法或类。

ParamArrayAttribute:指示方法在其调用中将允许数目可变的自变量。 此类不能被继承。

SerializableAttribute:表示类可以序列化。 此类不能被继承。

5)Xml操作常用Attribute

XmlElementAttribute:指示公共字段或属性在 XmlSerializer 序列化或反序列化包含它们的对象时表示 XML 元素。

XmlIgnoreAttribute:指示 Serialize(TextWriter, Object) 的 XmlSerializer 方法不序列化公共字段或公共读/写属性值。

XmlIncludeAttribute:允许 XmlSerializer 在它序列化或反序列化对象时识别类型。

XmlNamespaceDeclarationsAttribute:指定目标属性、参数、返回值或类成员包含与 XML 文档中使用的命名空间相关联的前缀。

XmlRootAttribute:控制视为 XML 根元素的属性目标的 XML 序列化。

XmlTextAttribute:当串行化或反序列化包含该成员的类时,向 XmlSerializer 指示应将该成员作为 XML 文本处理。

XmlTypeAttribute:控制当属性目标由 XmlSerializer 序列化时生成的 XML 架构。

3、创建自定义特性

可通过定义特性类创建自己的自定义特性,特性类是直接或间接派生自 Attribute 的类,可快速轻松地识别元数据中的特性定义。 假设希望使用编写类型的程序员的姓名来标记该类型。 可能需要定义一个自定义 Author 特性类:

例如,

[System.AttributeUsage(System.AttributeTargets.Class |  
                       System.AttributeTargets.Struct)  
]  
public class AuthorAttribute : System.Attribute  
{  
    private string name;  
    public double version;  
    public AuthorAttribute(string name)  
    {  
        this.name = name;  
        version = 1.0;  
    }  
}  

 

注意:类名 AuthorAttribute 是该特性的名称,即 Author 加上 Attribute 后缀。 由于该类派生自 System.Attribute,因此它是一个自定义特性类。

1)第一个参数 规定特性可被放置的语言元素。它是枚举器 AttributeTargets 的值的组合。默认值是 AttributeTargets.All。可以使用|指定多个。

2)参数 allowmultiple(可选的)为该特性的 AllowMultiple 属性(property)提供一个布尔值。如果为 true,则该特性是多用的。默认值是 false(单用的)。

3)inherited(可选的)为该特性的 Inherited 属性(property)提供一个布尔值。如果为 true,则该特性可被派生类继承。默认值是 false(不被继承)。

使用Attribute方法如下:

[Author("cjavapy", version = 1.0)]  
class SampleClass  
{  
      private string code = "csharp";
      private string name = "cjavapy";
      private int age = 0;
}  

AttributeUsage 有一个命名参数 AllowMultiple,通过此命名参数可一次或多次使用自定义特性。

例如,

[System.AttributeUsage(System.AttributeTargets.Class |  
                       System.AttributeTargets.Struct,  
                       AllowMultiple = true)  // 可以使用多个Attribute
]  
public class AuthorAttribute : System.Attribute  

使用时一个可以指定多个标签,

例如,

[Author("cjavapy", version = 1.1)]  
[Author("levi", version = 1.2)]  
class SampleClass  
{  
      private string code = "csharp";
      private string name = "cjavapy";
      private int age = 0; 
}  

标签:C#,Attribute,System,特性,private,标签,序列化,属性
From: https://www.cnblogs.com/GaoUpUp/p/17187782.html

相关文章

  • C# 索引器
    C#索引器 索引器(Indexer)是C#引入的一个新型的类成员,它使得类中的对象可以像数组那样方便、直观的被引用。索引器非常类似于属性,但索引器可以有参数列表,且只......
  • C# 反射(Reflection)
    C#反射(Reflection)反射提供描述程序集、模块和类型的对象(Type类型)。可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后调用......
  • C# 事件(event)
    C#事件(event) 事件是一种特殊的多播委托,仅可以从声明事件的类或结构中对其进行调用。类或对象可以通过事件向其他类或对象通知发生的相关事情。发送(或引发)事......
  • C# 委托(delegate)
    C#委托(delegate)委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-El......
  • RocketMQ高可用机制
    RocketMQ高可用机制集群部署模式1.单master模式2.多master模式配置配置文件broker.properties的brokerClusterName需要保持一致brokerId需要为0,0代表为0优缺点......
  • C# break和continue关键字
    C#break和continue关键字break跳出最里层的循环,并且继续执行该循环下面的语句。continue适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代......
  • C# 方法
    C#方法在C#的语言中,方法相当于其它语言中的函数,但是它与传统的函数也有着明确的不同:在结构化的语言中,整个程序是由一个个函数组成的;但是在面向对象的语言里,整个......
  • C# 方法 重载
    C#方法重载在C#的语言中,方法相当于其它语言中的函数,但是它与传统的函数也有着明确的不同:在结构化的语言中,整个程序是由一个个函数组成的;但是在面向对象的语言......
  • C# 方法 参数
    C#方法参数在C#的语言中,方法相当于其它语言中的函数,但是它与传统的函数也有着明确的不同:在结构化的语言中,整个程序是由一个个函数组成的;但是在面向对象的语言里......
  • C# 作用域
    C#作用域在C#里,作用域是由花括号的位置决定的。C#用一对大括号作为语句块的范围,称为作用域,在作用域里定义的变量,只有在该作用域结束之前才可使用。本文主要介......