61阅读

c特性attribute-C#特性(Attribute)详细介绍(转载)

发布时间:2018-01-19 所属栏目:详细介绍

一 : C#特性(Attribute)详细介绍(转载)

1、什么是Atrribute
首先,我们肯定Attribute是1个类,下面是msdn文档对它的描述:
公共语言运行时允许你添加类似关键字的描述声明,叫做attributes,它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes和Microsoft .NETFramework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行之际影响应用程序的行为。

在.NET中,Attribute被用来处理多种问题,比如序列化、程序的安全特征、防止即时编译器对程序代码进行优化从而代码容易调试等等。下面,我们先来看几个在.NET中标准的属性的使用,稍后我们再回过头来讨论Attribute这个类本身。(文中的代码使用C#编写,但同样适用所有基于.NET的所有语言)

2、Attribute作为编译器的指令
在C#中存在着一定数量的编译器指令,如:#define DEBUG, #undefine DEBUG,#if等。这些指令专属于C#,而且在数量上是固定的。而Attribute用作编译器指令则不受数量限制。比如下面的3个Attribute:

Conditional:起条件编译的作用,只有满足条件,才允许编译器对它的代码进行编译。一般在程序调试之际使用。
DllImport:用来标记非.NET的函数,表明该方法在1个外部的DLL中定义。
Obsolete:这个属性用来标记当前的方法已经被废弃,不再使用了。
下面的代码演示了上述3个属性的使用:

C#特性(Attribute)详细介绍(转载)1attributeusage C#特性(Attribute)详细介绍(转载)#defineDEBUG //这里定义条件
2attributeusage C#特性(Attribute)详细介绍(转载)
3attributeusage C#特性(Attribute)详细介绍(转载)usingSystem;
4attributeusage C#特性(Attribute)详细介绍(转载)usingSystem.Runtime.InteropServices;
5attributeusage C#特性(Attribute)详细介绍(转载)usingSystem.Diagnostics;
6attributeusage C#特性(Attribute)详细介绍(转载)
7attributeusage C#特性(Attribute)详细介绍(转载)namespaceAttributeDemo
8attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载){
9attributeusage C#特性(Attribute)详细介绍(转载)class MainProgramClass
10attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载) attributeusage C#特性(Attribute)详细介绍(转载){
11attributeusage C#特性(Attribute)详细介绍(转载)
12attributeusage C#特性(Attribute)详细介绍(转载)[DllImport("User32.dll")]
13attributeusage C#特性(Attribute)详细介绍(转载)public static extern int MessageBox(int hParent, string Message, string Caption, int Type);
14attributeusage C#特性(Attribute)详细介绍(转载)
15attributeusage C#特性(Attribute)详细介绍(转载)static void Main(string[] args)
16attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载) attributeusage C#特性(Attribute)详细介绍(转载){
17attributeusage C#特性(Attribute)详细介绍(转载)DisplayRunningMessage();
18attributeusage C#特性(Attribute)详细介绍(转载)DisplayDebugMessage();
19attributeusage C#特性(Attribute)详细介绍(转载)
20attributeusage C#特性(Attribute)详细介绍(转载)MessageBox(0,"Hello","Message",0);
21attributeusage C#特性(Attribute)详细介绍(转载)
22attributeusage C#特性(Attribute)详细介绍(转载)Console.ReadLine();
23attributeusage C#特性(Attribute)详细介绍(转载)}
24attributeusage C#特性(Attribute)详细介绍(转载)
25attributeusage C#特性(Attribute)详细介绍(转载)[Conditional("DEBUG")]
26attributeusage C#特性(Attribute)详细介绍(转载)private static void DisplayRunningMessage()
27attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载) attributeusage C#特性(Attribute)详细介绍(转载){
28attributeusage C#特性(Attribute)详细介绍(转载)Console.WriteLine("开始运行Main子程序。当前时间是"+DateTime.Now);
29attributeusage C#特性(Attribute)详细介绍(转载)}
30attributeusage C#特性(Attribute)详细介绍(转载)
31attributeusage C#特性(Attribute)详细介绍(转载)[Conditional("DEBUG")]
32attributeusage C#特性(Attribute)详细介绍(转载)//[Obsolete("Don't use Old method, use Newmethod", true)]
33attributeusage C#特性(Attribute)详细介绍(转载)[Obsolete]
34attributeusage C#特性(Attribute)详细介绍(转载)private static void DisplayDebugMessage()
35attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载) attributeusage C#特性(Attribute)详细介绍(转载){
36attributeusage C#特性(Attribute)详细介绍(转载)Console.WriteLine("开始Main子程序");
37attributeusage C#特性(Attribute)详细介绍(转载)}
38attributeusage C#特性(Attribute)详细介绍(转载)}
39attributeusage C#特性(Attribute)详细介绍(转载)}C#特性(Attribute)详细介绍(转载)

如果在1个程序元素前面声明1个Attribute,那么就表示这个Attribute被施加到该元素上,前面的代码,[DllImport]施加到MessageBox函数上,[Conditional]施加到DisplayRuntimeMessage方法和DisplayDebugMessage方法,[Obsolete]施加到DisplayDebugMessage方法上。

根据上面涉及到的3个Attribute的说明,我们可以猜到程序运行之际产生的输出:DllImportAttribute表明了MessageBox是User32.DLL中的函数,这样我们即可像内部方法一样调用这个函数。

重要的一点就是Attribute就是1个类,所以DllImport也是1个类,Attribute类是在编译之际被实例化的,而不是像通常的类那样在运行时候才实例化。Attribute实例化之际根据该Attribute类的设计可以带参数,也可以不带参数,比如DllImport就带有"User32.dll"的参数。Conditional对满足参数的定义条件的代码进行编译,如果没有定义DEBUG,那么该方法将不被编译,读者可以把#defineDEBUG一行注释掉看看输出的结果(release版本,在Debug版本中Conditional的debug总是成立的)。Obsolete表明了DispalyDebugMessage方法已经过时了,它有1个更好的方法来代替它,当我们的程序调用1个声明了Obsolete的方法时,那么编译器会给出信息,Obsolete还有其他2个重载的版本。大家可以参考msdn中关于的ObsoleteAttribute类的描述。

3、Attribute类
除了.NET提供的那些Attribute派生类之外,我们可以自定义我们自己的Attribute,所有自定义的Attribute必须从Attribute类派生。现在我们来看一下Attribute类的细节:

protected Attribute(): 保护的构造器,只能被Attribute的派生类调用。

3个静态方法:

static AttributeGetCustomAttribute():这个方法有八种重载的版本,它被用来取出施加在类成员上指定类型的Attribute。

static Attribute[] GetCustomAttributes():这个方法有十六种重载版本,用来取出施加在类成员上指定类型的Attribute数组。

static boolIsDefined():由8种重载版本,看是否指定类型的定制attribute被施加到类的成员上面。

实例方法:

bool IsDefaultAttribute(): 如果Attribute的值是默认的值,那么返回true。

bool Match():表明这个Attribute实例是否等于1个指定的对象。

公共属性: TypeId:得到1个唯一的标识,这个标识被用来区分同1个Attribute的不同实例。

我们简单地介绍了Attribute类的方法和属性,还有一些是从object继承来的。这里就不列出来了。

下面介绍如何自定义1个Attribute:自定义1个Attribute并不需要特别的知识,其实就和编写1个类差不多。自定义的Attribute必须直接或者间接地从Attribute这个类派生,如:

public MyCustomAttribute : Attribute { ... }

这里需要指出的是Attribute的命名规范,也就是你的Attribute的类名+"Attribute",当你的Attribute施加到1个程序的元素上之际,编译器先查找你的Attribute的定义,如果没有找到,那么它就会查找“Attribute名称"+Attribute的定义。如果都没有找到,那么编译器就报错。

4、定义或控制特性的使用

对于1个自定义的Attribute,你可以通过AttributeUsage的Attribute来限定你的Attribute所施加的元素的类型。代码形式如下:
[AttriubteUsage(参数设置)] public自定义Attribute : Attribute { ... }

非常有意思的是,AttributeUsage本身也是1个Attribute,这是专门施加在Attribute类的Attribute.AttributeUsage自然也是从Attribute派生,它有1个带参数的构造器,这个参数是AttributeTargets的枚举类型。下面是AttributeTargets的定义:

C#特性(Attribute)详细介绍(转载)1attributeusage C#特性(Attribute)详细介绍(转载)publicenum AttributeTargets
2attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载){
3attributeusage C#特性(Attribute)详细介绍(转载)All=16383,
4attributeusage C#特性(Attribute)详细介绍(转载)Assembly=1,
5attributeusage C#特性(Attribute)详细介绍(转载)Module=2,
6attributeusage C#特性(Attribute)详细介绍(转载)Class=4,
7attributeusage C#特性(Attribute)详细介绍(转载)Struct=8,
8attributeusage C#特性(Attribute)详细介绍(转载)Enum=16,
9attributeusage C#特性(Attribute)详细介绍(转载)Constructor=32,
10attributeusage C#特性(Attribute)详细介绍(转载)Method=64,
11attributeusage C#特性(Attribute)详细介绍(转载)Property=128,
12attributeusage C#特性(Attribute)详细介绍(转载)Field=256,
13attributeusage C#特性(Attribute)详细介绍(转载)Event=512,
14attributeusage C#特性(Attribute)详细介绍(转载)Interface=1024,
15attributeusage C#特性(Attribute)详细介绍(转载)Parameter=2048,
16attributeusage C#特性(Attribute)详细介绍(转载)Delegate=4096,
17attributeusage C#特性(Attribute)详细介绍(转载)ReturnValue=8192
18attributeusage C#特性(Attribute)详细介绍(转载)}C#特性(Attribute)详细介绍(转载)

作为参数的AttributeTarges的值允许通过“或”操作来进行多个值得组合,如果你没有指定参数,那么默认参数就是All 。AttributeUsage除了继承Attribute 的方法和属性之外,还定义了以下3个属性:

AllowMultiple: 读取或者设置这个属性,表示是否可以对1个程序元素施加多个Attribute 。

Inherited:读取或者设置这个属性,表示是否施加的Attribute 可以被派生类继承或者重载。

ValidOn: 读取或者设置这个属性,指明Attribute 可以被施加的元素的类型。

下面让我们来做一些实际的东西。我们将会在Help特性前放置AttributeUsage特性以期待在它的帮助下控制Help特性的使用。

C#特性(Attribute)详细介绍(转载)1attributeusage C#特性(Attribute)详细介绍(转载)usingSystem;
2attributeusage C#特性(Attribute)详细介绍(转载)[AttributeUsage(AttributeTargets.Class),AllowMultiple =false,
3attributeusage C#特性(Attribute)详细介绍(转载)Inherited= false ]
4attributeusage C#特性(Attribute)详细介绍(转载)publicclass HelpAttribute : Attribute
5attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载){
6attributeusage C#特性(Attribute)详细介绍(转载)publicHelpAttribute(StringDescription_in)
7attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载){
8attributeusage C#特性(Attribute)详细介绍(转载)this.description= Description_in;
9attributeusage C#特性(Attribute)详细介绍(转载)}
10attributeusage C#特性(Attribute)详细介绍(转载)protectedString description;
11attributeusage C#特性(Attribute)详细介绍(转载)publicString Description
12attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载){
13attributeusage C#特性(Attribute)详细介绍(转载)get
14attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载){
15attributeusage C#特性(Attribute)详细介绍(转载)returnthis.description;
16attributeusage C#特性(Attribute)详细介绍(转载)}
17attributeusage C#特性(Attribute)详细介绍(转载)}
18attributeusage C#特性(Attribute)详细介绍(转载)}C#特性(Attribute)详细介绍(转载)

  先让我们来看一下AttributeTargets.Class。它规定了Help特性只能被放在class的前面。这也就意味着下面的代码将会产生错误:

C#特性(Attribute)详细介绍(转载)1attributeusage C#特性(Attribute)详细介绍(转载)[Help("thisis a do-nothing class")]
2attributeusage C#特性(Attribute)详细介绍(转载)publicclass AnyClass
3attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载){
4attributeusage C#特性(Attribute)详细介绍(转载)[Help("thisis a do-nothing method")] //error
5attributeusage C#特性(Attribute)详细介绍(转载)publicvoid AnyMethod()
6attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载){
7attributeusage C#特性(Attribute)详细介绍(转载)}
8attributeusage C#特性(Attribute)详细介绍(转载)}C#特性(Attribute)详细介绍(转载)

  编译器报告错误如下:

  AnyClass.cs: Attribute 'Help' is not valid on this declarationtype.

  It is valid on 'class' declarations only.

  我们可以使用AttributeTargets.All来允许Help特性被放置在任何程序实体前。可能的值是:

  Assembly,Module,Class,Struct,Enum,Constructor,Method,Property,Field,Event,Interface,
Parameter,Delegate。

  All = Assembly | Module |Class | Struct | Enum | Constructor | Method | Property | Field |Event | Interface | Parameter | Delegate,

  ClassMembers = Class | Struct| Enum | Constructor | Method | Property | Field | Event | Delegate| Interface )

  下面考虑一下AllowMultiple = false。它规定了特性不能被重复放置多次。

C#特性(Attribute)详细介绍(转载)1attributeusage C#特性(Attribute)详细介绍(转载)[Help("thisis a do-nothing class")]
2attributeusage C#特性(Attribute)详细介绍(转载)[Help("itcontains a do-nothing method")]
3attributeusage C#特性(Attribute)详细介绍(转载)publicclass AnyClass
4attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载){
5attributeusage C#特性(Attribute)详细介绍(转载)[Help("thisis a do-nothing method")] //error
6attributeusage C#特性(Attribute)详细介绍(转载)publicvoid AnyMethod()
7attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载){
8attributeusage C#特性(Attribute)详细介绍(转载)}
9attributeusage C#特性(Attribute)详细介绍(转载)}C#特性(Attribute)详细介绍(转载)

  它产生了1个编译期错误。

  AnyClass.cs: Duplicate 'Help' attribute

  Ok,现在我们来讨论一下最后的这个属性。Inherited, 表明当特性被放置在1个基类上时,它能否被派生类所继承。

C#特性(Attribute)详细介绍(转载)1attributeusage C#特性(Attribute)详细介绍(转载)[Help("BaseClass")]
2attributeusage C#特性(Attribute)详细介绍(转载)publicclass Base
3attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载){
4attributeusage C#特性(Attribute)详细介绍(转载)}
5attributeusage C#特性(Attribute)详细介绍(转载)
6attributeusage C#特性(Attribute)详细介绍(转载)publicclass Derive : Base
7attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载){
8attributeusage C#特性(Attribute)详细介绍(转载)}
9attributeusage C#特性(Attribute)详细介绍(转载)C#特性(Attribute)详细介绍(转载)

  这里会有4种可能的组合:

  [AttributeUsage(AttributeTargets.Class, AllowMultiple = false,Inherited = false ]

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

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

  [AttributeUsage(AttributeTargets.Class, AllowMultiple = true,Inherited = true ]

  第1种情况:

  如果我们查询(Query)(稍后我们会看到如何在运行期查询1个类的特性)Derive类,我们将会发现Help特性并不存在,因为inherited属性被设置为false。

  第二种情况:

  和第1种情况相同,因为inherited也被设置为false。

  第3种情况:

  为了解释第3种和第4种情况,我们先来给派生类添加点代码:

C#特性(Attribute)详细介绍(转载)1attributeusage C#特性(Attribute)详细介绍(转载)[Help("BaseClass")]
2attributeusage C#特性(Attribute)详细介绍(转载)publicclass Base
3attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载){
4attributeusage C#特性(Attribute)详细介绍(转载)}
5attributeusage C#特性(Attribute)详细介绍(转载)[Help("DeriveClass")]
6attributeusage C#特性(Attribute)详细介绍(转载)publicclass Derive : Base
7attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载)attributeusage C#特性(Attribute)详细介绍(转载){
8attributeusage C#特性(Attribute)详细介绍(转载)}C#特性(Attribute)详细介绍(转载)

  现在我们来查询一下Help特性,我们只能得到派生类的属性,因为inherited被设置为true,但是AllowMultiple却被设置为false。因此基类的Help特性被派生类Help特性覆盖了。

  第4种情况:

  在这里,我们将会发现派生类既有基类的Help特性,也有自己的Help特性,因为AllowMultiple被设置为true。

至此,我们介绍了有关Attribute类和它们的代码格式。你一定想知道到底如何在你的应用程序中使用Attribute,如果仅仅是前面介绍的内容,还是不足以说明Attribute有什么实用价值的话,那么从后面的章节开始我们将介绍几个Attribute的不同用法,相信你一定会对Attribute有1个新的了解。

二 : C++11 新特性之 tuple

我们在C++中都用过pair.pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同.pair可以使用make_pair构造

pairp = make_pair(1, "a1");

如果传入的参数为多个,那么就需要嵌套pair,如下代码
#include#includeusing namespace std;int main(){//,注意:在嵌套模板实参列表中应当使用‘>>’而非‘>>’map>>m; maptemp1;temp1.insert(make_pair("b1", "c1"));map>temp2;temp2.insert(make_pair("a1", temp1));m.insert(make_pair(1, temp2));maptemp3;temp3.insert(make_pair("b2", "c2"));map>temp4;temp4.insert(make_pair("a2", temp3));m.insert(make_pair(2, temp4));//遍历map>>::const_iterator itr1;map>::const_iterator itr2;map::const_iterator itr3;for (itr1=m.begin(); itr1!=m.end(); itr1++){cout<first<<" ";itr2 = (itr1->second).begin(); cout<first<<" "; itr3 = (itr2->second).begin(); cout<first<<" "; cout<second<p = make_pair(1, "a1");return 0;}

上面的做法明显很麻烦,在C&#43;&#43;11中引入了变长参数模板,所以发明了新的数据类型:tuple,tuple是一个N元组,可以传入1个, 2个甚至多个不同类型的数据,避免了嵌套pair的丑陋做法,通过make_tuple()创建元组,通过get<>()来访问元组的元素

#include#include#includeusing namespace std;int main(){auto t1 = make_tuple(1, "a1", "b1", "c1");cout<(t1)<<" ";cout<(t1)<<" ";cout<(t1)<<" ";cout<(t1)<<" ";cout<>tv;tv.push_back(make_tuple(1, "a1", "b1", "c1"));tv.push_back(make_tuple(2, "a2", "b2", "c2"));vector>::iterator itr;for (itr=tv.begin(); itr!=tv.end(); itr++){cout<(*itr)<<" ";cout<(*itr)<<" ";cout<(*itr)<<" ";cout<(*itr)<

扩展:c 11新特性 / c 11 新特性 pdf / c 11 tuple

三 : C# 中特性(Attribute)的使用简介

Attribute(特性)

MSDN给出的定义:

Attribute 类将预定义的系统信息或用户定义的自定义信息与目标元素相关联。目标元素可以是程序集、类、构造函数、委托、枚举、事件、字段、接口、方法、可移植可执行文件模块、参数、属性(Property)、返回值、结构或其他特性(Attribute)。

在.Net程序中,可以使用特性(Attribute)来解决许多问题。如:将WebService中接口函数标记为WebMethod,将类标记为可序列化等等。

此外,我们也可以自定义Attribute,来实现我们需要的功能。但自定义Attribute必须继承自Attribute类。Attribute中有很多方法或者属性,为我们提供了强大的功能。一般我们通过反射的方式来使用Attribute。

下面结合实际项目中的使用谈谈自己的体会。

需求:项目中有一个专门的日志库。现在项目中需要前端用到查询、翻页、按各个字段排序等等功能。由于日志数据可能有无效的数据,并且数据量较大。为了提升统计、翻页性能,所以建立了许多临时表。如果在实际操作中为一个一个不同的需求去建立临时表,造成代码大量重复臃肿,并且不便于统一管理,考虑到的方案是通过Attribute的方式,统一建临时表。

主体思路如下:通过自定义特性来描述要建立临时表的字段的相关类型、长度等等信息,然后通过反射的方式获取这些字段对应的这些特性,然后构造相应的SQL命令就可以完成临时表的建立了。

特性定义如下:

[AttributeUsage(AttributeTargets.Property)]

public class TableFieldAttribute : Attribute

{

/// <summary>

/// 字段长度

/// </summary>

public int Length { get; set; }

/// <summary>

/// 字段描述

/// </summary>

public string Describe { get; set; }

/// <summary>

/// 字段类型

/// </summary>

public string Type { get; set; }

}

以上AttributeUsage,也是一个继承自Attribute的类,他的作用就是标志自定义类的使用范围,如:字段,属性,类,方法。以及使用我们自定义类

标记的类的子类是否继承特性等。

有了这个自定义特性,将它运用到实体上就行了。

public class TableEntity

{

[TableField(Describe = "Guid主键", Length = 36, Type = "uniqueidentifier")]

public Guid Guid { get; set; }

[TableField(Describe = "名称", Length = 36, Type = "varchar ")]

public string Name { get; set; }

}

这样在实体定义上,我们就已经有了定义好了数据类型,长度等等。在实际要建临时表时,通过反射要建临时表的实体,便能构造相应的SQL命令了。

工具类的定义:public class Tools<T> where T : class。实际使用时,将泛型类型换成相应的类型即可。

主要给出如何使用反射来获取临时表具体字段的信息代码:

public static List<Record> GetTableFieldsInformation()

{

Type t = typeof(T);

PropertyInfo[] propertyInfos = t.GetProperties();

List<Record> tableEntities = new List<Record>();

propertyInfos.ToList().ForEach(property =>

{

IList<CustomAttributeData> list = property.GetCustomAttributesData();

if (list.Count == 1)

{

tableEntities.Add(GetTableEntity(list[0].NamedArguments, property));

}

else

{

throw new Exception();

}

});

return tableEntities;

}

这样,GetTableFieldsInformation()方法中返回的List就是包含了临时表一个字段的所有信息的列表。我们循环列表,构造Sql命令

主要代码如下:

recordEntities.ForEach(record =>

{

if (i == 0)

{

sql = "CREATE TABLE [" + record.TableName + "](";

}

if (list.All(item => !record.Type.Equals(item, StringComparison.OrdinalIgnoreCase)))

{

sql += string.Format("{0} {1}({2}),", record.FieldName, record.Type, record.Length);

}

else

{

sql += string.Format("{0} {1},", record.FieldName, record.Type);

}

i++;

});

程序最终执行后如下图:

attributeusage C# 中特性(Attribute)的使用简介

主要的思想就是这些。另外,如果你细心,你会发现AttributeUsage特性使用和我定义的TableFieldAttribute使用方式上有写不一样。

TableFieldAttribute的使用方式:[TableField(Describe = "Guid主键", Length = 36, Type = "uniqueidentifier")]

AttributeUsage的使用方式:[AttributeUsage(AttributeTargets.Property)]。

同样是自定义的特性,为什么我们定义的和Framework库里的使用不一样呢。?通过Reflect看看AttributeUsage的源码,如下图:

attributeusage C# 中特性(Attribute)的使用简介

从图中标记的地方来看,是由于在AttributeUsage中属性的定义【AttributeTargets ValidOn】以及构造函数的定义不一样导致的。

有兴趣深入研究的同学可以自己试试。

后记:特性的使用是很强大的一项功能。本例中使用的仅仅是其他很小的一部分。因此只对在实际应用中做了写说明。另:代码是没有经过细致整理

代码下载:http://up.2cto.com/2011/1025/20111025113636140.rar

摘自:tyb1222

扩展:c语言 / c站 / cf

本文标题:c特性attribute-C#特性(Attribute)详细介绍(转载)
本文地址: http://www.61k.com/1122243.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1