C#:study(14)--属性(Attribute)

  • 注意   根据约定,所有属性名称都以单词“Attribute”结束,以便将它们与 .NET Framework 中的其他项区。但是,在代码中使用属性时不需要指定属性后缀。例如,[DllImport] 虽等效于 [DllImportAttribute]DllImportAttribute 才是该属性在 .NET Framework 中的实际名称。

三个重要的C#属性

AttributeUsage 描述自定义属性类的用法。
Conditional 标记条件方法,即执行取决于指定预处理标识符的方法。
Obsolete 标记不应使用的程序实体。

一、Conditional
标记其执行取决于指定预处理标识符的条件方法。
格式:[Conditional(conditionalSymbol)]

如果某个方法具有多个 Conditional 属性,且至少定义了多个条件符号(换言之,这些符号彼此之间存在逻辑“”关系)中的一个,则将包含对该方法的调用。

[Conditional("A"), Conditional("B")] public static void IfAorB( ) 
{
   ...
}
如何获得对符号进行逻辑“与”运算的效果? SDK上的不行????
二、Obsolete
格式:[Obsolete(message)]或[Obsolete(message,iserror)]
参数:
message(string)理想情况下,是人工可读的关于项已过时的原因以及改为使用什么的解释。
iserror(bool)如果为 true,则编译器应将该项的使用视为错误。默认值为 false(编译器生成一个警告)。
三、AttributeUsage
格式:[AttributeUsage( validon, AllowMultiple=allowmultiple,Inherited=inherited)]

参数:

validon
指定属性可以放置在其上的语言元素(AttributeTargets 值的组合)。默认值为 AttributeTargets.All
allowmultiple(可选)
bool;如果为 true,则属性为多次使用。默认值为 false(使用一次)。
inherited(可选)
bool;如果为 true,则属性由派生类继承。默认值为 false(不继承)。
//下面是一个完整的示例。定义一个自定义属性,将其应用于若干实体并通过反射进行检索。
 1 // cs_attributes_retr.cs
 2 using System;
 3 [AttributeUsage(AttributeTargets.Class|AttributeTargets.Struct,
 4    AllowMultiple=true)]
 5 public class Author : Attribute
 6 {
 7    public Author(string name) 
 8    {
 9       this.name = name; version = 1.0
10    }
11    public double version;
12    string name;
13    public string GetName() 
14    {
15       return name; 
16    }
17 }
18 
19 [Author("H. Ackerman")]
20 class FirstClass 
21 {
22    /**/ 
23 }
24 
25 class SecondClass  // no Author attribute
26 {
27    /**/ 
28 }
29 
30 [Author("H. Ackerman"), Author("M. Knott", version=1.1)]
31 class Steerage 
32 
33    /**/ 
34 }
35 
36 class AuthorInfo 
37 {
38    public static void Main() 
39    {
40       PrintAuthorInfo(typeof(FirstClass));
41       PrintAuthorInfo(typeof(SecondClass));
42       PrintAuthorInfo(typeof(Steerage));
43    }
44    public static void PrintAuthorInfo(Type t) 
45    {
46       Console.WriteLine("Author information for {0}", t);
47       Attribute[] attrs = Attribute.GetCustomAttributes(t);
48       foreach(Attribute attr in attrs) 
49       {
50          if (attr is Author) 
51          {
52             Author a = (Author)attr;
53             Console.WriteLine("   {0}, version {1:f}",
54 a.GetName(), a.version);
55          }
56       }
57    }
58 }
59 输出
60 Author information for FirstClass
61    H. Ackerman, version 1.00
62 Author information for SecondClass
63 Author information for Steerage
64    H. Ackerman, version 1.00
65    M. Knott, version 1.10
66 


 

posted @ 2005-08-23 12:31  zhh007's Bolg  阅读(310)  评论(0)    收藏  举报