C# 自定义与非自定义属性?

C# 自定义与非自定义属性?,c#,.net,custom-attributes,C#,.net,Custom Attributes,实现ICCustomAttributeProvider接口的东西将允许您通过GetCustomAttributes方法获取已应用于它的自定义属性。据我所知,自定义属性基本上是一个特殊的类(以“attribute”结尾并扩展属性类),它被创建为使用适当的语法(例如,在C#中,在方法/类/etc之前)应用于某个方法或类。但如果这是一个自定义属性,那么什么是非自定义属性?我过去认为与.NET绑定的属性是非自定义的,但是GetCustomAttributes甚至会返回像System.ThreadStat

实现
ICCustomAttributeProvider
接口的东西将允许您通过
GetCustomAttributes
方法获取已应用于它的自定义属性。据我所知,自定义属性基本上是一个特殊的类(以“attribute”结尾并扩展
属性
类),它被创建为使用适当的语法(例如,在C#中,在方法/类/etc之前)应用于某个方法或类。但如果这是一个自定义属性,那么什么是非自定义属性?我过去认为与.NET绑定的属性是非自定义的,但是
GetCustomAttributes
甚至会返回像
System.ThreadStaticAttribute
这样的属性,它们是.NET框架的核心


是否存在非自定义属性,或者“自定义属性”只是同义反复?

属性派生的所有内容都是自定义属性

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

自定义属性是我们附加的东西——我们想要关联并用来描述的方面,但它们不是固有的。

请参阅,引用:

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


另请参见关于扩展元数据的CLI规范,其中引用了术语“自定义”属性(如中的I.9.7)

我不知道以下内容是否有任何相关性,但如果您说

var a = typeof(string).Attributes;

您将获得一个名为的标志枚举类型的值。也许这些标志是该类型的“非自定义”属性?

我认为这可能是正确的。自定义属性不是“类型属性”。为了进一步说明,我在MSDN上读到了这篇文章:“几乎所有反射类都可以有与其关联的属性。属性可以是标准的(公共的、私有的、帮助字符串的)或自定义的。”要对此稍作扩展,
TypeAttributes
MethodAttributes
PropertyAttributes
FieldAttributes
,也许还有更多的都是通过各种
属性可以找到的非自定义属性。
属性:
类型.attributes
方法信息.attributes
,等等。