C#特性编程(2)

  在程序中出现了大量警告,警告处使用[Obsolete]特性,并且输出 [Obsolete]特性的string类型参数。虽然编译出现警告,但编译成功了,执行ObsoletetTest程序,运行结果如图7.19所示。

ObsoletetTest正常运行

图7.19 ObsoletetTest正常运行

  本程序中_Name属性同时使用了多个特性,这时可用逗号分隔,将多个特性共存于同一对方括号中。

解析

  [Obsolete]特性在团队合作时非常有用,它可以帮助开发者选择性地使用某些调试中的类或方法。[Obsolete]特性的编写方法如以下代码所示:

+展开
-C#
  [Obsolete("警告文本")]
  //被注释项(一般为类或成员)

  [Obsolete]特性的参数为string类型,即可作为在编译时警告的说明文本。

面试例题13:如何自定义特性?

考点:理解特性相关类,学习自定义特性的方法。

出现频率:★★

解答

  自定义特性只有定义System.Attribute类的一个派生类,才可以在程序中使用。在目录下新建一个程序文件,并命名为CustomAttribute.cs,编写代码如代码7.18所示。

代码7.18 自定义特性:CustomAttribute.cs

+展开
-C#
using System;

class CustomAttribute
{
static void Main(string[] args)
{
//获取Person类的Type对象tp
Type tp = Type.GetType("Person");
//获取tp对象的特性数组,并将数组赋值给MyAtts
object[] MyAtts = tp.GetCustomAttributes(false);
//遍历并输出MyAtts数组子项的Msg属性
foreach (ClassMsgAttribute m in MyAtts)
{
Console.WriteLine("Person类的特性:{0}", m.Msg);
}
//获取BadPerson类的Type对象,并将引用赋值给tp
tp = Type.GetType("BadPerson");
//获取tp对象的特性数组,并将数组赋值给MyAtts
MyAtts = tp.GetCustomAttributes(false);
//遍历并输出MyAtts数组子项的Message属性
foreach (ObsoleteAttribute m in MyAtts)
{
Console.WriteLine("BadPerson类的特性:{0}", m.Message);
}
}
}
//限定特性类的应用范围
[AttributeUsage(AttributeTargets.Class | 
AttributeTargets.Field,AllowMultiple = true,Inherited = false)]
//定制MsgAttribute特性类,继承于Attribute
public class ClassMsgAttribute : Attribute
{
//定义_msg字段和Msg属性
//Msg属性用于读写msg字段
string _msg;
public string Msg
{
get
{
return _msg;
}
set
{
_msg = value;
}
}
public ClassMsgAttribute() { }
//重载构造函数接收一个参数,赋值给_msg字段
public ClassMsgAttribute(string s)
{
_msg = s;
}
}
//在Person类上标记ClassMsg特性
[ClassMsg(Msg="这是关于人的姓名信息的类")]
class Person
{
//在_name字段上应用ClassMsg特性
[ClassMsg("这是存储姓名的字段")]
string _name;
//以下特性无法应用,因为MsgAttribute定义的特性只能用于类和字段
//[ClassMsg("这是读写姓名字段的属性")]
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
}
//标记BadPerson类的Obsolete特性
[Obsolete("这是个坏人,不要用他")]
class BadPerson
{
string _name;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
}

  在命令行下编译CustomAttribute.cs,执行CustomAttribute程序,运行结果如图7.20所示。

自定义特性

图7.20 自定义特性

  本示例中的自定义特性仅存储了一个字符串值,运行时获取被注释项所属类型的Type对象,然后调用GetCustomAttributes()方法。本例通过该方法输出了自定义特性ClassMsgAttribute的Msg属性值,以及ObsoleteAttribute特性的Message属性值。

解析

 特性实际是System.Attribute类的派生类,所以自定义特性需要定义以System.Attribute类为基类的特性类,如以下代码所示:

+展开
-C#
using System.;

public class 自定义特性类名称 : Attribute
{
类体代码;
}

  在使用自定义特性时,可以根据构造函数的定义传递参数。特性有一个独特的语法,即命名属性法,在特性的构造函数中使用"属性=值"的方式声明,该方式用于特性被反射时对属性进行初始化。特性也可以被限制使用范围,只需要在自定义特性类前面添加[AttributeUsage]特性,该特性的具体参数如以下代码所示:

+展开
-C#
[AttributeUsage(AttributeTargets.Class | AttributeTargets.
Field,AllowMultiple = true,Inherited = false)]


  该特性第1个参数为AttributeTargets枚举值,以上代码为自定义特性仅允许用于类(Class)和字段(Field);第2个参数AllowMultiple代表在相同元素上是否可以注释多次;第3个参数代表是否可以被派生类继承。

来源:http://www.51cto.com

加支付宝好友偷能量挖...


评论(0)网络
阅读(100)喜欢(0)Asp.Net/C#/WCF