文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Microsoft.Net框架程序设计学习笔记(25):检测定制特性

Microsoft.Net框架程序设计学习笔记(25):检测定制特性

时间:2011-03-29  来源:辛勤的代码工

  定义一个特性类型本身没有什么用处,应用程序代码的行为不会因此有任何改变。

  在枚举类型上应用Flags特性可以改变System.Enum.ToString、Format方法的行为,这是因为它们会在运行时检测所操作的枚举类型上是否应用了Flags特性。应用程序利用反射技术来查找目标元素上应用了哪些特性。

  如果我们是微软公司负责实现Enum类型中Format方法的员工,我们可能会像下面这样来实现它:  上面代码调用了Type.IsDefined方法,它会查寻枚举类型的元数据来判断其上是否应用了Flags特性。

public static String Format(Type enumType, Object value, String format)
{
//检测传入的枚举类型是否应用了Flags类型的实例
if(enumType.IsDefined(typeof(FlagsAttribute), false))
{
//定义了Flags特性的操作
}
else
{
//未定义Flags特性的操作
}
}

  依上述代码所见,如果我们定义了自己的特性类型,我们还必须实现某些代码来检测目标元素上是否应用了这些特性类型的实例,然后根据检测结果执行相应的代码路径。只有这样,定制特性才有意义。

  有时,我们可能希望特性检测的目标元素不是一个类型,而是一个程序集、一个模块或一个方法。System.Attribute类型定义了3个静态方法来获取应用于目标元素上的特性:IsDefined、GetCustomAttributes、GetCustomAttribute。每个方法有好几个重载版本,允许我们检测各种不同目标元素上的定制特性。这些方法都是通过在元素数据上执行某种反射操作来查询与CLS兼容的定制特性。

  IsDefined:如果至少有一个指定的Attribute的派生类型应用在目标元素上,该方法返回true。该方法执行速度比较快,因为它不需要构造(反序列化)任何特性类型的实例。

  GetCustomAttributes:该方法返回一个数组,其中元素是指定的、应用在目标元素上的特性实例。每个实例都会用编译期间指定的参数、字段、属性来构造(反序列化)。如果目标元素上没有应用指定的特性实例,方法将返回一个空数组。该方法通常用于那些将AllowMultiple设为true的特性。

  GetCustomAttribute:该方法返回一个指定的、应用在目标元素上的特性实例。返回的实例使用编译期间指定的参数、字段、属性来构造(反序列化)。如果目标元素上没有应用指定的特性实例,方法抛出一个System.Reflection.AmbiguousMatchEexception异常。该方法通常用于那些将AllowMultiple设为false的特性。

  另外,System.Reflection命名空间中定义的一些类型还允许我们查看一个模块中的元数据内容。这些类型也提供了IsDefined和GetCustomAttributes方法。

  还有一个问题要注意:当我们向IsDefined、GetCustomAttribute、GetCustomAttributes传递一个类型时,这些方法会在应用程序中搜索我们指定的特性类型及其所有的派生类型。如果我们的代码找到一个具体的特性类型,我们应该对返回值做一个额外的检查,以确保这些方法返回的类型就是我们正在搜索的类型。建议大家将自己的特性类型定义为密封类型,从而减少潜在的混淆并省去这种额外的检查。

  

相关阅读 更多 +
排行榜 更多 +
白银之城手游官服下载

白银之城手游官服下载

角色扮演 下载
像素赛车手魔改版下载

像素赛车手魔改版下载

赛车竞速 下载
全民摆摊免广告版下载

全民摆摊免广告版下载

模拟经营 下载