using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Specialized;
namespace ConsoleApplication32
{
//限定特性类的应用范围
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Field,AllowMultiple=true,Inherited=false)]
//定制MsgAttribute特性类,继续于Attribute
public class ClassMsgAttribute : Attribute
{
//定义_msg字段和Msg属性
string _msg;
public string Msg
{
get { return _msg; }
set { _msg = value; }
}
public ClassMsgAttribute() { }
//重新构造函数接收一个参数,赋值给_msg
public ClassMsgAttribute(string s) { _msg = s; }
}
//特性也是一个类,必须继承于System.Attribute类,命名规范为“类名”+Attribute。不管是直接还是间接继承,都会成为一个特性类,特性类的声明定义了一种可以放置在声明之上新的特性。
public class myclasAttribute : Attribute
{
string _msg;
public string Msg
{
get { return _msg; }
set { _msg = value; }
}
public myclasAttribute() { }
public myclasAttribute(string s) { _msg = s; }
}
//在Person上标记ClassMsg特性
[ClassMsg(Msg="这是关于人的姓名信息的类")]
public class Person
{
//在_name字段上应用ClassMsg特性
[ClassMsg("这是存储姓名的字段")]
string _name;
//以下特性无法应用,因为MsgAttribute定义的特性只能用于类和字段
//[ClassMsg("这是读写姓名字段的属性")]
public string name
{
get { return _name; }
set { _name = value; }
}
}
class Program
{
static void Main(string[] args)
{
//获取Person类的Type对象tp
Type tp = Type.GetType("ConsoleApplication32.Person");//这里要引用命名空间
Console.WriteLine(tp.GetType());
//获取tp对象的特性数组,并将数组赋值给MyAtts
object[] MyAtts = tp.GetCustomAttributes(false);//GetCustomAttributes用于获取程序集的特性,也就是这个程序集合中包含了多少个特性
//遍历并输出MyAtts数组子项的Msg属性
foreach (ClassMsgAttribute m in MyAtts)
{
Console.WriteLine("Person类的特型:{0}", m.Msg);
}
}
}
}
Attribute:特性的一个例子
最新推荐文章于 2024-11-17 15:39:19 发布