【问题标题】:C# Attributes and attribute location/targetsC# 属性和属性位置/目标
【发布时间】:2010-03-04 15:58:52
【问题描述】:

我正在阅读有关属性的信息,并了解可以使用您的代码将它们应用于不同的目标实体 - (请参阅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' 不是可识别的属性 地点。此块中的所有属性 将被忽略。

所以我的问题是 - 为什么必须在某些属性上指定属性目标,而不要求或允许其他属性?此外,您必须为哪些执行此操作?

【问题讨论】:

    标签: c# attributes


    【解决方案1】:

    如果目标没有在代码中表示,您必须明确指定目标。我只知道三个目标,程序集、模块和返回:

    [return: MyAttribute]
    public static int meth(
    

    对于class指定class:是多余的,编译器可以理解你的意思

    【讨论】:

    • +1 并接受了答案,虽然它不应该是'ReturnValue:',而不是'Return:'
    【解决方案2】:

    您可以为任何属性用法指定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 { }
    

    【讨论】:

    • 这是最好的答案,因为它给出了正确的目标关键字type:。可能的全局目标是assemblymodule,非全局目标是fieldeventmethodparampropertyreturntype
    • 为什么不能使用getset目标?对不起,可以使用method目标,但是不舒服((
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-03
      • 2012-03-04
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多