特性应该我们大多接触过,比喻经常使用的[Obsolete],[Serializable]等下面我就主要介绍一个特性的一些用法
摘自MSDN定义:用以将元数据或声明信息与代码(程序集、类型、方法、属性等)相关联。
意思就是把我们自定义的特性或者微软自带的特性和我们的代码进行组合,其实就是为我们某些代码附加一些信息
1:先看.Net带的三种特性1.1:[Obsolete]这个预定义特性标记了不应被使用的程序实体
参数 message,是一个字符串,描述项目过时原因以及特带的项目。参数 error,是一个布尔值。如果该值为 true,编译器应把该项目的使用当作一个错误。默认值是 false(编译器生成一个警告)。[Obsolete("过时方法")]PRivatestaticvoidOutModed()
{
Console.WriteLine("我是过时的方法");
}
然后引用的时候就出现
如果加上false我们发现在引用的使用就没法编译过去大家可以自己试验下
1.2:[Conditional]这个预定义特性指示编译器应忽略方法调用或属性,除非已定义指定的条件编译符号
参数 conditionString,获取与 ConditionalAttribute 属性相关的条件编译符号。
privatestaticvoidMain(string[] args)
{
Debug();
Trace();
}
[Conditional("DEBUG")]privatestaticvoidDebug() {
Console.WriteLine("我是debug");
}
[Conditional("TRACE")]publicstaticvoidTrace()
{
Console.WriteLine("我是TRACE");
}
当调试成trace模式的时候只能结果:
1.3:[AttributeUsage]描述了如何使用一个自定义特性类。并加上限制
参数AttributeTargets 指定可以对它们应用特性的应用程序元素参数allowMultiple 指示该特性是单用还是多用 默认false参数inherited是否可以继续 默认true创建一个自定义特性
[AttributeUsage(AttributeTargets.Method)]publicclassCustomAttribute:Attribute
{publicstringName {get;set; }publicCustomAttribute(stringname)
{
Name=name;
}
}
上面的限制是只能用于方法
[Custom()]//报错internalclassProgram
{privatestaticvoidMain(string[] args)
{
}
allowMultiple = false。它规定了特性不能被重复放置多次所以下面代码会报错
[Custom("1")]//报错[Custom("2")]publicvoidMethod()
{
}
2:自定义特性先定义一个特性类
[AttributeUsage(AttributeTargets.All,AllowMultiple =true,Inherited =false)]publicclassCustomAttribute:Attribute
{publicstringName {get;set; }publicintAge {get;set; }publicCustomAttribute(stringname,intage)
{
Name=name;
Age=age;
}
}
然后定义一个基类
[Custom("张三",3)]publicclassBase
{publicstaticvoidMethod()
{
Console.WriteLine("我具有一个特性");
}
}
publicstaticvoidGetAttributeInfo(Type t) {varmyattribute = (CustomAttribute)Attribute.GetCustomAttribute(t,typeof(CustomAttribute));if(myattribute!=null)
{
Console.WriteLine("姓名:{0}\n年龄:{1}", myattribute.Name, myattribute.Age);
}
}
调用
GetAttributeInfo(typeof(Base));
publicclassBase
{
[Custom("张三",3)]//方法上publicstaticvoidMethod()
{
Console.WriteLine("我具有一个特性");
}
}
就改变t的写法:t.GetMethod("Method")这样来获取特性运行效果一样