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

时间:2010-03-04 15:58:52

标签: c# attributes

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

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

[assembly: AssemblyTitle("AttributesDemo")]
[assembly: AssemblyDescription("")]

这对我有意义。目标是程序集的属性。

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

[MyAttribute]
class MySerialzableClass
{

MyAttribute为:

[AttributeUsage (AttributeTargets.All)]
public class MyAttribute : System.Attribute
{
}

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

[class: MyAttribute]
class MySerialzableClass
{

这给编译器警告:

  

'class'不是公认的属性   地点。此块中的所有属性   将被忽略。

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

3 个答案:

答案 0 :(得分:5)

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

[return: MyAttribute]
public static int meth(

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

答案 1 :(得分:4)

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

非默认目标的示例:

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

public int Property {
  get;
  [param: MyAttribute] // applies to the parameter to the setter
  set;
}

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

[type: MyAttribute] 
class MySerialzableClass { }

答案 2 :(得分:3)

通常,属性在其影响之前出现,例如类或方法。对于程序集范围的属性,没有“之前”,因此您必须指定。