自定义属性与非自定义属性有什么区别?

9
实现ICustomAttributeProvider接口的内容将允许你通过GetCustomAttributes方法获取已应用于它的自定义属性。据我所知,自定义属性基本上是一个特殊类(以"Attribute"结尾并扩展Attribute类),它被创建为使用适当的语法(例如,在C#中,在方法/类等前面添加[FooAttribute])应用于某些内容。但如果这是一个自定义属性,那么什么是自定义属性?我曾经认为捆绑在.NET中的属性是非自定义的,但是GetCustomAttributes甚至返回像System.ThreadStaticAttribute这样对于.NET框架非常核心的属性。存在“非自定义属性”吗,还是“自定义属性”只是一种同义反复?
3个回答

7

Attribute的所有派生类都是自定义属性。

“Attribute”是一个通用术语。现实世界中的对象具有无数个属性。类、成员和参数都有我们可以描述的属性--名称、类型、访问器、成员数量、继承信息等。

自定义属性是我们添加上去的东西--我们想要关联和描述,但并不是固有的。


2
我不知道以下内容是否有任何关联,但如果你说。
var a = typeof(string).Attributes;

你得到了一个叫做 TypeAttributes 的标志枚举类型的值。也许这些标志是该类型的“非自定义”属性?

我认为这可能是正确的。自定义属性是那些不属于“类型属性”的东西。 - Jez
为了更加明确,我刚刚在MSDN上读到了这样的内容: “几乎所有的反射类(Reflection classes)都可以与属性相关联。属性可以是标准的(public, private, HelpString)或自定义的。” - Jez
稍微详细解释一下,TypeAttributesMethodAttributesPropertyAttributesFieldAttributes,以及其他一些属性都是你可以通过各种.Attributes属性找到的非自定义属性:Type.AttributesMethodInfo.Attributes等。 - wensveen

2

参见维基百科,引用:

开发人员可以通过属性向其代码添加元数据。属性有两种类型:自定义属性和伪自定义属性,对于开发人员来说,它们具有相同的语法。代码中的属性是发送给编译器生成元数据的消息。在CIL中,诸如继承修饰符、作用域修饰符以及几乎任何不是操作码或流的元素都被称为属性。

另请参阅CLI规范关于扩展元数据的部分,在那里可以找到“自定义”属性这个术语的引用(例如http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf中的I.9.7)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接