电子科技大学软件学院03级02班 周银辉
特性(Attribute),使得我们可以将一些自定义信息附加到程序实体上,这非常有用,比如我们可以利用它来加密函数库,记录其它一些重要信息等。
1,如何定义一个我们所需要的特性:
1),特性实际上和普通的类一样,只不过它必须继承于Attribute类。
2),我们适用AttributeUsage特性来限定自定义特性的使用范围。
比如我们创建一个用于给类加密的密码特性:
///
<summary>
/// 自定义密码特性,该特性只可应用于类
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class PasswordAttribute : Attribute
{
string psw;
public string Psw
{
get
{
return psw;
}
set
{
psw = value;
}
}
public PasswordAttribute( string psw)
{
this .psw = psw;
}
}
/// 自定义密码特性,该特性只可应用于类
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class PasswordAttribute : Attribute
{
string psw;
public string Psw
{
get
{
return psw;
}
set
{
psw = value;
}
}
public PasswordAttribute( string psw)
{
this .psw = psw;
}
}
以后我们就可以像使用其它特性一样将我们的密码特性作用于其它类上了。
比如:
///
<summary>
/// 测试类,该类有一个密码特性
/// </summary>
[Password( " 123 " )]
public class TestClass
{
}
/// 测试类,该类有一个密码特性
/// </summary>
[Password( " 123 " )]
public class TestClass
{
}
2,如何解析自定义的特性:
我们将TestClass赋予了一个密码“123”,我们如何解析出这个密码呢?
很简单,这需要了解一个名为CustomAttributeData的类,它为自定义特性提供反射访问。
比如:
///
<summary>
/// 获取指定类型的密码特性
/// </summary>
/// <param name="type"> 类型 </param>
/// <returns> 密码 </returns>
public static string GetPassword(Type type)
{
// 扫描指定类型的所有自定义特性
foreach (CustomAttributeData data in CustomAttributeData.GetCustomAttributes(type))
{
// 如果是密码特性
if (data.Constructor.DeclaringType.Equals( typeof (PasswordAttribute)))
{
// 返回密码特性的第一个参数,也就是密码
if (data.ConstructorArguments.Count > 0 )
{
return data.ConstructorArguments[ 0 ].Value.ToString();
}
}
}
return string .Empty;
}
/// 获取指定类型的密码特性
/// </summary>
/// <param name="type"> 类型 </param>
/// <returns> 密码 </returns>
public static string GetPassword(Type type)
{
// 扫描指定类型的所有自定义特性
foreach (CustomAttributeData data in CustomAttributeData.GetCustomAttributes(type))
{
// 如果是密码特性
if (data.Constructor.DeclaringType.Equals( typeof (PasswordAttribute)))
{
// 返回密码特性的第一个参数,也就是密码
if (data.ConstructorArguments.Count > 0 )
{
return data.ConstructorArguments[ 0 ].Value.ToString();
}
}
}
return string .Empty;
}
其它更复杂的操作可以参考MSDN,以下是上面示例的完整代码:
示例代码
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Reflection;
5
6
7namespace AttributeTest
8{
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 string psw = PasswordParser.GetPassword(typeof(TestClass));
14
15 Console.WriteLine("password is:{0}", psw);
16 }
17 }
18
19
20 /**//// <summary>
21 /// 自定义密码特性,该特性只可应用于类
22 /// </summary>
23 [AttributeUsage(AttributeTargets.Class)]
24 public class PasswordAttribute : Attribute
25 {
26 string psw;
27
28 public string Psw
29 {
30 get
31 {
32 return psw;
33 }
34 set
35 {
36 psw = value;
37 }
38 }
39
40 public PasswordAttribute(string psw)
41 {
42 this.psw = psw;
43 }
44 }
45
46
47 /**//// <summary>
48 /// 测试类,该类有一个密码特性
49 /// </summary>
50 [Password("123")]
51 public class TestClass
52 {
53
54 }
55
56
57 /**//// <summary>
58 /// 密码特性解析器
59 /// </summary>
60 public class PasswordParser
61 {
62 /**//// <summary>
63 /// 获取指定类型的密码特性
64 /// </summary>
65 /// <param name="type">类型</param>
66 /// <returns>密码</returns>
67 public static string GetPassword(Type type)
68 {
69
70 //扫描指定类型的所有自定义特性
71 foreach (CustomAttributeData data in CustomAttributeData.GetCustomAttributes(type))
72 {
73 //如果是密码特性
74 if (data.Constructor.DeclaringType.Equals(typeof(PasswordAttribute)))
75 {
76 //返回密码特性的第一个参数,也就是密码
77 if (data.ConstructorArguments.Count > 0)
78 {
79 return data.ConstructorArguments[0].Value.ToString();
80 }
81 }
82 }
83
84 return string.Empty;
85 }
86 }
87}
88
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Reflection;
5
6
7namespace AttributeTest
8{
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 string psw = PasswordParser.GetPassword(typeof(TestClass));
14
15 Console.WriteLine("password is:{0}", psw);
16 }
17 }
18
19
20 /**//// <summary>
21 /// 自定义密码特性,该特性只可应用于类
22 /// </summary>
23 [AttributeUsage(AttributeTargets.Class)]
24 public class PasswordAttribute : Attribute
25 {
26 string psw;
27
28 public string Psw
29 {
30 get
31 {
32 return psw;
33 }
34 set
35 {
36 psw = value;
37 }
38 }
39
40 public PasswordAttribute(string psw)
41 {
42 this.psw = psw;
43 }
44 }
45
46
47 /**//// <summary>
48 /// 测试类,该类有一个密码特性
49 /// </summary>
50 [Password("123")]
51 public class TestClass
52 {
53
54 }
55
56
57 /**//// <summary>
58 /// 密码特性解析器
59 /// </summary>
60 public class PasswordParser
61 {
62 /**//// <summary>
63 /// 获取指定类型的密码特性
64 /// </summary>
65 /// <param name="type">类型</param>
66 /// <returns>密码</returns>
67 public static string GetPassword(Type type)
68 {
69
70 //扫描指定类型的所有自定义特性
71 foreach (CustomAttributeData data in CustomAttributeData.GetCustomAttributes(type))
72 {
73 //如果是密码特性
74 if (data.Constructor.DeclaringType.Equals(typeof(PasswordAttribute)))
75 {
76 //返回密码特性的第一个参数,也就是密码
77 if (data.ConstructorArguments.Count > 0)
78 {
79 return data.ConstructorArguments[0].Value.ToString();
80 }
81 }
82 }
83
84 return string.Empty;
85 }
86 }
87}
88