①声明自定义特性,以Attribute 结尾,继承Attribute ,一般声明成私密类
//可以有构造函数,字段,属性
/// <summary>
/// 限制特性使用
/// </summary>
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor)]//限制特性使用
public sealed class MyAttributeAttribute : Attribute
{
public string Description { get; set; }
public string VersionNumber { get; set; }
public string Reviewer { get; set; }
/// <summary>
/// 构造函数只能在贴特性的时候使用;
/// 使用时可以用位置参数和命名参数来构成,如 [MyAttribute(desc,ver,Reviewer="rev")]
/// </summary>
public MyAttributeAttribute(string desc, string ver)
{
Description = desc;
VersionNumber = ver;
}
}
②限制特性使用:AttributeUsage
//AttributeUsage有3个重要属性,ValidOn(保存特性能应用到的目标类型的列表。构造函数的第一个参数必须是AttributeTarget类型的枚举值),Inherited(一个布尔值,指示特性是否会被装饰类型的派生类所继承),AllowMutiple(指示目标是否被引用多个特性的实例的布尔值)
//AttributeUsage 构造函数接收单个位置参数,表示该特性能贴到的目标类型,就是ValidOn;我们可以使用按位或运算来组合使用类型
[AttributeUsage(
AttributeTargets.Method | AttributeTargets.Constructor,
Inherited=false,//可选的,命名参数
AllowMultiple = false)]//可选的,命名参数
访问特性:得到特性之后,我们就能根据特性的对象获取由构造函数贴进去的属性值
③访问特性IsDefined
[AttributeUsage(AttributeTargets.Class)]
public sealed class ReviewCommentAttribute : Attribute
{
public string VersionNumber { get; set; }
public string Reviewer { get; set; }
public ReviewCommentAttribute(string Rev, string ver)
{
Reviewer = Rev;
VersionNumber = ver;
}
}
[ReviewComment("check it out","2.4")]
public class TestAttribute
{
}
static void Main(string[] args)
{
TestAttribute tt = new TestAttribute();
Type type = tt.GetType();
bool isDefined= type.IsDefined(typeof(ReviewCommentAttribute), false);
if (isDefined)
{
Console.WriteLine("ReviewComment is Applied to type {0}");
}
}
④访问特性GetCustomAttributes方法
1.typeof.GetCustomAttribute(typeof(TestAttribute ),false);
2.//GetCustomerAttribute 方法返回应用到结构特性的数组,因为是object[],所以我们需要强转转为相应的特性类型
Type type= typeof(TestAttribute);
object[] AttArr = type.GetCustomAttributes(false);
foreach (Attribute a in AttArr)
{
ReviewCommentAttribute attr = a as ReviewCommentAttribute;
if (null!=attr)
{
Console.WriteLine("VersionNumber:{0}",attr.VersionNumber);
Console.WriteLine("Reviewer:{0}", attr.Reviewer);
Console.WriteLine("Description:{0}", attr.Description);
}
}