为什么我可以使用"[Authorize]"这个缩写而不是实际类名"[AuthorizeAttribute]"?

3
我正在浏览ASP.NET Web堆栈源代码,发现AuthorizateAttribute类实际上是这样命名的(请参见此处)。
那么,为什么我可以使用[Authorize]来应用该属性...但那并不是类的真正名称。类的名称是AuthorizateAttribute
我实际上将代码复制/粘贴到了我的解决方案中,并将类重命名为JeffthorizeAttribute,结果我无法将[Jeffthorize]属性添加到我的MVC控制器中。
为什么它接受缩写版本而不是完整的类名?是否在父属性类中有自动找出的东西?
只是想理解一下 :(

没什么不好的!你找到它是很好的。现在我们可以把这些问题联系起来。 - quetzalcoatl
4个回答

9
当你使用属性时(在语法上很明显),C#编译器会自动尝试添加后缀Attribute,以方便操作。根据C# 5规范第17.2节(属性规范)的惯例,属性类都以后缀Attribute命名。形式为type-nameattribute-name可以包含或省略此后缀。如果同时找到带有和不带有此后缀的属性类,则出现歧义,导致编译时错误。如果拼写的attribute-name的最右标识符是逐字解释标识符(§2.4.2),则只匹配没有后缀的属性,从而使此类歧义得以解决。
在特定情况下,你应该能够使用你的[Jeffthroize]示例,但很难确定为什么不能使用,需要查看代码和错误消息。
例如,以下内容是正确的:
using System;

[AttributeUsage(AttributeTargets.All)]
class FooAttribute : Attribute {}        

[FooAttribute] // Full name
class Test 
{
    [Foo] // Abbreviated name
    public static void Main() {}
}

如果你尝试使用 [@Foo],那是无效的 - 但 [@FooAttribute] 是有效的。
还要注意,VB 有相同的速记方式

感谢您的输入。非常感激。 - Jeff Johnson
@JGinSD:那是C# 1.2规范 - 不幸的是我不认为有完整的C# 5规范以HTML格式存在。但我会在我的回答中添加Word版本的链接。 - Jon Skeet

4

这实际上是编译器强制执行的语法糖。按照惯例,您可以在不使用后缀的情况下引用属性。

http://msdn.microsoft.com/en-us/library/84c42s56(v=vs.110).aspx

按照惯例,属性类的名称以单词“Attribute”结尾。虽然不是必需的,但建议遵循此约定以提高可读性。应用属性时,包含单词“Attribute”是可选的。

我从未想过这可能是编译器或特定于语言的“功能”。感谢快速回答。 - Jeff Johnson
C#有几个基于约定的特性,例如成员默认为private。Jon Skeet可能比我更详细地解释这一点 :) - Josh

1
因为这是在类或方法上使用属性的命名标准。

0

简单来说,编译器是这样编写的,所以它被接受了。

有一个要求,所有的Attribute必须派生自Attribute类。因此可以假设方括号[]中的所有内容都是“属性”。

程序员有一个惯例,通常将XXXX命名为XxxxThing、PersonView、LoginController、ReadOnlyAttribute等。当您查看文件时,这会让您对代码有更好的了解。然而,当您只处理控制器、视图或属性时,总是说XxxxAttribute、YyyyAttribute很烦人。

由于您知道所有写在[]中的东西都是Attribute类的,因此没有必要在类名中写入包含Attribute单词。这没有任何意义。您知道它是属性,因为它在[]中。

这只是编程语言/编译器提供的一个方便快捷的简写,仅在代码的此处可用。如果您使用反射搜索该属性类,或者尝试Activator.Create<>甚至typeof()它,您仍然需要使用完整名称。

关于自定义属性的问题:

  • 确保您的using指令正确
  • 确保您已添加引用
  • 确保重新编译所有程序集
  • 确保typeof(JeffthrotizeAttribute)不会抱怨未知类型。如果是这样,请回到前三点
  • 如果编译器仍在抱怨[Jeffthrotize],则很可能您的标志有误。请记住,属性必须正确指定AttributeUsage。如果指定了AttributeTargets.Method,则无法将该属性放在整个类上。您可以使用|操作符结合属性用法,就像任何标志一样:AttributeTargets.Method|AttributeTargets.Class等等。

请查看 http://msdn.microsoft.com/pl-pl/library/system.attributetargets.aspx 获取完整列表。


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