为什么System.ComponentModel.AttributeCollection索引器不一致?

时间:2013-04-17 21:36:28

标签: c# reflection

在参考System.ComponentModel.AttributeCollection.this [Type t]索引器时,http://msdn.microsoft.com/en-us/library/yadycs8s.aspx处的文档说明如下

  

如果集合中不存在该属性,则此属性返回属性类型的默认值。

考虑到这一点,以下代码按预期工作:(>表示输出)

using System.ComponentModel;
var attrCollection = new AttributeCollection();
Console.WriteLine(attrCollection[typeof(BrowsableAttribute)] != null);
> "True"

按照我的预期打印“True”。但是尝试使用另一个随机属性如DebuggerDisplay,索引器将返回null:

var attrCollection = new AttributeCollection();
Console.WriteLine(attrCollection[typeof(System.Diagnostics.DebuggerDisplayAttribute)] != null);
> "False"

关于这些属性之间有什么不同,导致不同行为的任何想法?我不清楚msdn的“属性类型的默认值”是什么意思,因为它不仅仅是null。我想也许问题是没有无参数构造函数的属性类型,但是BrowsableAttribute需要一个参数,DebuggerDisplayAttribute也是如此。

1 个答案:

答案 0 :(得分:2)

在AttributeCollection的MSDN库文章中明确记录了它:

  

虽然大多数属性都有默认值,但不需要默认值。如果属性没有默认值,则从采用类型的索引属性返回null。定义自己的属性时,可以通过提供不带参数的构造函数或定义名为“Default”的属性类型的公共静态字段来声明默认值。

BrowsableAttribute具有默认值,由其默认字段提供,因此您的测试成功。默认情况下,当缺少属性时,它会使类成员可浏览。

DebuggerDisplayAttribute既没有默认构造函数也没有默认字段。如果您考虑一下这是有道理的,那么在调试器中没有任何有用的默认值。