为什么我可以使用简写“而不是实际类的名称,“?
我正在浏览ASP.NET Web堆栈源代码,并注意到AuthorizateAttribute
类实际上是这样命名的( 参见此处 )。
那么,为什么我可以使用[Authorize]
来应用属性……但这并不是Class的名称。 该类的名称是AuthorizateAttribute
。
我实际上将代码复制/粘贴到我自己的解决方案中,并将该类重命名为JeffthorizeAttribute
,并且我不能将[Jeffthorize]
属性添加到我的MVC控制器中。
为什么它接受缩短的版本而不是完整的类名? 父属性类中是否存在自动计算出来的内容?
只是想了解:(
当您使用属性时(语法上很明显),C#编译器会自动尝试附加后缀Attribute
。 它只是让事情变得更容易。 从C#5规范部分17.2(属性规范):
按照惯例,属性类以后缀
Attribute
命名。 表单类型名称的属性 名称可以包含或省略此后缀。 如果找到带有和不带此后缀的属性类,则会出现歧义,并导致编译时错误。 如果属性名拼写使得其最右侧标识符是逐字标识符(第2.4.2节),则仅匹配没有后缀的属性,从而使得能够解决这种不明确性。
您应该能够使用[Jeffthroize]
示例 – 如果没有看到代码和错误消息,很难说明为什么在特定情况下[Jeffthroize]
。
例如,这很好:
using System; [AttributeUsage(AttributeTargets.All)] class FooAttribute : Attribute {} [FooAttribute] // Full name class Test { [Foo] // Abbreviated name public static void Main() {} }
如果您尝试使用[@Foo]
,那将无效 – 但[@FooAttribute]
有效。
另请注意, VB具有相同的速记 。
它本质上是编译器强制执行的语法糖。 按照惯例,您可以引用不带后缀的Attribute。
http://msdn.microsoft.com/en-us/library/84c42s56(v=vs.110).aspx
按照惯例,属性类的名称以“属性”一词结尾。 虽然不是必需的,但建议使用此约定以提高可读性。 应用该属性时,包含单词Attribute是可选的。
因为这是要在一个或多个类上使用的属性的命名标准。
好吧,简单地说,它被接受,因为编译器是以这种方式编写的。
要求所有Attribute
必须从Attribute
类派生。 因此,可以假设括号[]
中的所有内容都是“属性”。
有一个程序员的习惯,XXXX经常被命名为XxxxThing,PersonView,LoginController,ReadOnlyAttribute。 当您查看文件时,它可以让您更好地查看代码。 但是,当你只处理控制器,只处理视图或只处理属性时,必须总是说XxxxAttribute,YyyyAttribute是很烦人的。
既然你知道 []
中写的所有东西都是Attribute
类,那么就不必编写类名中包含的Attribute
字。 它没有任何补充。 你知道它是一个属性,因为它在[]
。
它只是语言/编译器提供的一个方便的快捷方式,仅为方便起见,并且仅在代码中的这个位置可用。 如果使用Reflection搜索该属性类,或者尝试使用Activator.Create<>
或甚至typeof()
,则仍需要全名。
关于自定义属性的问题:
- 确保你的
using
正确 - 确保您已添加参考
- 确保您已重新编译所有程序集
- 确保
typeof(JeffthrotizeAttribute)
不会抱怨未知类型。 如果是这样 – 进入前三点 - 如果编译器仍然抱怨
[Jeffthrotize]
不是大多数可能你的标志错了。 请记住,属性需要正确指定AttributeUsage
。 如果指定AttributeTargets.Method
,那么您将无法将该属性放在整个类上。 您可以将属性用法与|
组合使用 运算符,与任何标志一样:AttributeTargets.Method|AttributeTargets.Class
等。
有关完整列表,请参见http://msdn.microsoft.com/pl-pl/library/system.attributetargets.aspx
。