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在自己写框架的时候用的比较多。
浙公网安备 33010602011771号