【问题标题】:Adding Attributes to C# Property set parameter将属性添加到 C# 属性集参数
【发布时间】:2010-11-03 18:59:47
【问题描述】:

现在,不使用属性,我有这个:

public void SetNumber([Array(new int[]{8})] Byte[] number)

如您所见,我在参数中添加了ArrayAttribute 属性。

我想做的是相同的,但在属性设置器上。这不起作用:

[Array(new int[]{8})]
public Byte[] SetNumber
{
  set
  {
  }
  get
  {
    return null;
  }
}

有没有办法将属性附加到set_SetNumber value 方法参数?

另外,一个相关的问题。生成的两种方法(get/set)没有自定义属性。谁能给我解释一下这是为什么?

【问题讨论】:

    标签: c# attributes properties


    【解决方案1】:

    你需要在set上使用paramattribute target

    public Byte[] SetNumber {
      [param: Array(new int[] { 8 })]
      set {
      }
      get {
        return null;
      }
    } 
    

    关于第二个问题,自定义属性是在属性本身上设置的,而不是在属性访问器方法上。

    此外,如果您的 ArrayAttribute 仅适用于参数,则可以这样定义:

    [AttributeUsage(AttributeTargets.Parameter)]
    public class ArrayAttribute : Attribute {
      // ...
    }
    

    【讨论】:

      【解决方案2】:

      你不这样做,就像你在第一个例子中所做的那样创建一个方法。除了值之外,你不能将任何东西传递给集合。

      public Byte[] TheNumber
      {
          private set;
          get
          {
              return null;
          }
      }
      
      public void SetNumber([Array(new int[] { 8 })] Byte[] number)
      {
          this.TheNumber = number;
      }
      

      【讨论】:

      • 顺便说一句,如果你有像上面这样的暴露属性,你可以使用私有集;
      • 实际上,这可能有效。只是一点背景说明,我正在从 XML 文件生成这些方法。该属性用于单元测试生成一个合适长度的数组作为参数。
      【解决方案3】:

      我不确定,但我猜你不能做你想做的事 - setter value 参数没有公开给你应用属性。

      至于您的第二个问题,属性不同于它的 getter 和 setter 方法。您可以像这样将属性应用于 setter 方法:

      public Byte[] SetNumber
      {
        [Array(new int[]{8})]
        set
        {
        }
        get
        {
          return null;
        }
      }
      

      【讨论】:

      • 我试过了,但是当我尝试在属性的设置方法版本上调用 GetCustomAttribute(true) 时(在“立即调试”窗口中),我仍然得到 null。无论如何,我想我现在会放弃这个想法。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 2011-09-17
      相关资源
      最近更新 更多