c#中Attribute的使用

Attribute(特性、标记、标签),在c#中用于表示类、属性、方法等具有某种特性,使用的格式[Attribute名字(构造函数的参数)],例如在一个类上边写上[Serializable],就表示这个类可以序列化,具有可序列化的特性。其实这个特性也是一个类,这个类继承自Attribute类,它本身并没有什么特殊的地方,也就是说这个类内部对于这种特性没做什么实质上的操作,仅仅是标记为具有某种特性而已,比如写上[Serializable],表示可以序列化,而真正的序列化是需要调用BinaryFormatter的Serialize方法。下面通过一个小实例来说明特性的使用:
自定义一个xml序列化方法
1、首先定义一个MyXmlAttribute特性类,要继承自Attribute,内部什么都不用干

1 public class MyXmlAttribute:Attribute
2     {
3         public MyXmlAttribute()
4         { }
5     }

2、定义MyXmlSerializer类,里边有一个xml序列化的方法Serialize,这里用到了反射

 1 public class MyXmlSerializer
 2     {
 3         /// <summary>
 4         /// 用于xml序列化的方法
 5         /// </summary>
 6         /// <param name="path"></param>
 7         /// <param name="obj"></param>
 8         public void Serialize(string path, object obj)
 9         {
10             //获取要序列化的对象的类型
11             Type type = obj.GetType();
12             //获取这个类型的特性集合
13             object[] objs = type.GetCustomAttributes(typeof(MyXmlAttribute), false);
14             if (objs.Length <= 0)
15             {
16                 throw new Exception("未标记为MyXmlAttribute");
17             }
18             else
19             {
20                 StringBuilder sbXml = new StringBuilder();
21                 sbXml.AppendLine("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
22                 sbXml.AppendLine("<" + type.Name + ">");
23                 //获取要序列化的对象的属性集合
24                 PropertyInfo[] propertyInfos = type.GetProperties();
25                 if (propertyInfos.Length > 0)
26                 {
27                     foreach (PropertyInfo item in propertyInfos)
28                     {
29                         sbXml.AppendLine("<" + item.Name + ">" + item.GetValue(obj, null) + "</" + item.Name + ">");
30                     }
31                 }
32                 sbXml.AppendLine("</" + type.Name + ">");
33                 File.WriteAllText(path, sbXml.ToString(), Encoding.UTF8);
34             }
35         }
36     }

3、定义一个Person类,用于序列化,需要打上特性标记[MyXml]

1 [MyXml]
2     public class Person
3     {
4         public string Name { get; set; }
5         public int Age { get; set; }
6         public string Email { get; set; }
7     }

4、在控制台程序中的代码,调用序列化方法,执行序列化

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             MyXmlSerializer mySerializer = new MyXmlSerializer();
 6             Person p = new Person();
 7             p.Name = "张三";
 8             p.Age = 12;
 9             p.Email = "zhangsan@163.com";
10             //调用序列化方法
11             mySerializer.Serialize("1.xml", p);
12             Console.WriteLine("序列化完成");
13             Console.ReadKey();
14         }
15     }

以上只是一个非常简单的例子,Attribute在自己写框架的时候用的比较多。

posted on 2012-09-17 09:19  无所畏惧  阅读(533)  评论(0)    收藏  举报