我正在阅读有关属性的内容,并了解可以使用代码将它们应用于不同的目标实体 - (请参阅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'不是公认的属性 地点。此块中的所有属性 将被忽略。
所以我的问题是这样的 - 为什么必须在某些属性上指定属性目标而不是为了其他属性而需要?此外,你必须为此做些什么?
答案 0 :(得分:5)
如果目标未在代码中表示,则必须明确指定目标。我只知道三个目标,装配,模块和返回:
[return: MyAttribute]
public static int meth(
用于指定类的类:过多,编译器可以理解你的意思
答案 1 :(得分:4)
您可以为任何属性用途指定attribute targets,但只有那些没有默认值(assembly
和module
)的属性才是强制性的。此外,当您要将属性应用于非默认目标时,必须使用这些注释。
非默认目标的示例:
[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)
通常,属性在其影响之前出现,例如类或方法。对于程序集范围的属性,没有“之前”,因此您必须指定。