我正在阅读有关属性的内容,并了解可以使用代码将它们应用于不同的目标实体 - (请参阅属性目标).
因此,查看项目中的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'不是公认的属性位置.此块中的所有属性都将被忽略.
所以我的问题是这样的 - 为什么必须在某些属性上指定属性目标而不是需要或允许其他属性?而且,你必须为此做些什么?
如果目标未在代码中表示,则必须明确指定目标.我只知道三个目标,装配,模块和返回:
[return: MyAttribute]
public static int meth(
Run Code Online (Sandbox Code Playgroud)
对于类指定类:过多,编译器可以理解你的意思
您可以为任何属性用法指定属性目标,但只有那些没有默认值 (assembly和module) 的才是强制性的。此外,当您想将属性应用于非默认目标时,您必须使用这些注释。
非默认目标示例:
[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)
| 归档时间: |
|
| 查看次数: |
2328 次 |
| 最近记录: |