=================================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);
//}
}
}