=================================AttributeUsage类
属性: AllowMultiple 指定是否可以在某个类或者方法中存在多个特性
例如在方法上有多个特性
[Developer("李四", "项目主管", Yesno = true)]
[Developer("王五", "项目经理", Yesno = true)]
public void aa()
{}
继承属性: Inherited <?xml:namespace prefix="[default]" ns="http://www.w3.org/1999/xhtml">?xml:namespace>假如有一个类继承自我们的DemoClass,那么当我们将RecordAttribute添加到DemoClass上时,DemoClass的子类也会获得该特性。而当特性应用于一个方法,如果继承自该类的子类将这个方法覆盖,那么Inherited则用于说明是否子类方法是否继承这个特性。
类: AttributeTargets
=================================AttributeTargets
publicenumAttributeTargets{
Assembly = 1, //可以对程序集应用属性。
Module = 2, //可以对模块应用属性。
Class = 4, //可以对类应用属性。
Struct = 8, //可以对结构应用属性,即值类型。
Enum = 16, //可以对枚举应用属性。
Constructor = 32, //可以对构造函数应用属性。
Method = 64, //可以对方法应用属性。
Property = 128, //可以对属性 (Property) 应用属性 (Attribute)。
Field = 256, //可以对字段应用属性。
Event = 512, //可以对事件应用属性。
Interface = 1024, //可以对接口应用属性。
Parameter = 2048, //可以对参数应用属性。
Delegate = 4096, //可以对委托应用属性。
ReturnValue = 8192, //可以对返回值应用属性。
GenericParameter = 16384, //可以对泛型参数应用属性。
All = 32767, //可以对任何应用程序元素应用属性。
}
=================================自定义特性(DeveloperAttribute类)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; namespace WindowsFormsApplication2 { [AttributeUsage(AttributeTargets.All,AllowMultiple=true)] public class DeveloperAttribute:Attribute { private string _name; private string _level; private bool yesno; public string Name { get { return _name; } } public string Level { get { return _level; } } //属性 public bool Yesno { get { return yesno; } set { yesno = value; } } //构造函数 public DeveloperAttribute(string name,string level) { this._name = name; this._level = level; this.yesno = false; } } }
=================================特性的使用(必须在共有类型上使用)
using System.Runtime.InteropServices;
1,在类上使用
[Developer("李四", "项目主管", Yesno = true)]
public class aa
{}
2,在方法上使用
[Developer("李四", "项目主管", Yesno = true)]
public void aa()
{}
=================================检索储存在特性中的信息
1,检索存在类上的特性的信息
[Developer("张三", "项目主管", Yesno = true)] [Developer("李四", "项目主管", Yesno = true)] public class aa { }
private void button1_Click(object sender, EventArgs e) { //第一种检索方式(检索一个) //DeveloperAttribute d= (DeveloperAttribute )Attribute.GetCustomAttribute(typeof(aa), typeof(DeveloperAttribute)); //MessageBox.Show(d.ToString() + "," + d.Name); //第二中检索方式(检索一个或多个) DeveloperAttribute[] de = (DeveloperAttribute[])Attribute.GetCustomAttributes(typeof(aa), typeof(DeveloperAttribute)); foreach (DeveloperAttribute d in de) { MessageBox.Show(d.Name); } //第三种检索方式(检索一个或多个) //Type t = typeof(aa); //object[] o = t.GetCustomAttributes(typeof(DeveloperAttribute), false); //foreach (DeveloperAttribute d in o) //{ // MessageBox.Show(d.ToString()+","+d.Name); //} }
2,检索存在方法上的特性的信息
[Developer("张迪", "项目经理", Yesno = true)] [Developer("张迪", "项目经理", Yesno = true)] public void getStr() { }
private void button2_Click(object sender, EventArgs e) { Type t = typeof(Form1); MethodInfo[] m = t.GetMethods(); for (int i = 0; i < m.Length; i++) { //第一种检索方式(检索一个) DeveloperAttribute a = (DeveloperAttribute)Attribute.GetCustomAttribute(m[i], typeof(DeveloperAttribute)); if(a!=null) MessageBox.Show(m[i].ToString() + "," + a.Name); //第二中检索方式(检索一个或多个) //DeveloperAttribute[] a = (DeveloperAttribute[])Attribute.GetCustomAttributes(m[i], typeof(DeveloperAttribute)); //foreach (DeveloperAttribute aa in a) //{ // MessageBox.Show(m[i].ToString() + "," + aa.Name); //} } }