C#属性和属性位置/目标

Jam*_*man 4 c# attributes

我正在阅读有关属性的内容,并了解可以使用代码将它们应用于不同的目标实体 - (请参阅属性目标).

因此,查看项目中的AssemblyInfo.cs文件,我可以看到以下内容:

[assembly: AssemblyTitle("AttributesDemo")]
[assembly: AssemblyDescription("")]
Run Code Online (Sandbox Code Playgroud)

这对我来说很有意义.目标是程序集的属性.

在我的代码中,我可以在类上添加一个属性,如下所示:

[MyAttribute]
class MySerialzableClass
{
Run Code Online (Sandbox Code Playgroud)

随着MyAttribute:

[AttributeUsage (AttributeTargets.All)]
public class MyAttribute : System.Attribute
{
}
Run Code Online (Sandbox Code Playgroud)

所以,我开始考虑assembly:第一个代码块中的语句.并尝试了这个,只是为了实验:

[class: MyAttribute]
class MySerialzableClass
{
Run Code Online (Sandbox Code Playgroud)

这给编译器警告:

'class'不是公认的属性位置.此块中的所有属性都将被忽略.

所以我的问题是这样的 - 为什么必须在某些属性上指定属性目标而不是需要或允许其他属性?而且,你必须为此做些什么?

And*_*rey 5

如果目标未在代码中表示,则必须明确指定目标.我只知道三个目标,装配,模块和返回:

[return: MyAttribute]
public static int meth(
Run Code Online (Sandbox Code Playgroud)

对于类指定类:过多,编译器可以理解你的意思


Jor*_*dão 5

您可以为任何属性用法指定属性目标,但只有那些没有默认值 (assemblymodule) 的才是强制性的。此外,当您想将属性应用于非默认目标时,您必须使用这些注释。

非默认目标示例:

[return: MyAttribute]   
public int Method() { ... }

public int Property {
  get;
  [param: MyAttribute] // applies to the parameter to the setter
  set;
}
Run Code Online (Sandbox Code Playgroud)

在您的示例中,正确的目标(默认)是type

[type: MyAttribute] 
class MySerialzableClass { }
Run Code Online (Sandbox Code Playgroud)