CA1019:定义属性参数的访问者。我不明白原因

时间:2010-12-22 16:56:33

标签: c# .net attributes

今天,我正在使用FXCop清理我的一些代码,它抱怨我对此违规行为的属性类。

CA1019: Define accessor for attribute argument.

在这个页面上,http://msdn.microsoft.com/en-us/library/ms182136.aspx有更多信息,但我仍然没有理由这样做,因为在我看来它更冗长,更不相关。

它提供了两个代码样本。

using System;

namespace DesignLibrary
{
// Violates rule: DefineAccessorsForAttributeArguments.

[AttributeUsage(AttributeTargets.All)]
public sealed class BadCustomAttribute :Attribute 
{
  string data;

  // Missing the property that corresponds to 
  // the someStringData parameter.

  public BadCustomAttribute(string someStringData)
  {
     data = someStringData;
  }
}


// Satisfies rule: Attributes should have accessors for all arguments.
[AttributeUsage(AttributeTargets.All)]
public sealed class GoodCustomAttribute :Attribute 
{
   string data;

   public GoodCustomAttribute(string someStringData)
   {
      data = someStringData;
   }
   //The constructor parameter and property
   //name are the same except for case.

   public string SomeStringData
   {
      get 
      {
         return data;
      }
   }
}
}

我不明白为什么需要SomeStringData属性。 someStringData不是一个参数吗?如果它已经存储在另一个属性中,为什么需要拥有自己的属性?

实际上,我看起来有点不同。

[AttributeUsage(AttributeTargets.Property)]
public sealed class ExampleAttribute : Attribute
{
    public ExampleAttribute(string attributeValue)
    {
        this.Path = attributeValue;
    }

    public string Name
    {
        get;
        set;
    }

    // Add to add this to stop the CA1019 moaning but I find it useless and stupid?
    public string AttributeValue
    {
        get
        {
            return this.Name;
        }
    }
}

我使用公共autoproperty而不是私有字段,我必须添加最后一部分以使警告停止,但我没有看到这一点,它还为此类添加了另一个公共字段,这是多余的,而且看起来不太干净。

那就是说,我认为这个警告是出于某种原因而提出的,所以我错过了什么理由呢?

提前致谢。

5 个答案:

答案 0 :(得分:7)

FxCop抱怨,因为您现有的属性与参数名称不匹配 因此,它没有意识到参数实际暴露。

您应该重命名属性或参数以匹配(大小写除外),或禁止警告。

答案 1 :(得分:3)

FxCop规则CA1019只是强制实施属性的.Net Framework编码指南。

  

对可选参数使用命名参数(读/写属性)。提供与每个命名参数同名的读/写属性,但更改大小写以区分它们。

文档链接:http://msdn.microsoft.com/en-us/library/2ab31zeh(v=vs.71).aspx

答案 2 :(得分:2)

FxCop警告背后的原因是,当Ref正在检索属性实例时,您传递给属性构造函数的每个数据都应该公开可供访问。

假设你有这个:

[BadCustom("My String Data")]
public class DecoratedClass
{ 
}

当您使用以下内容阅读时,如何从该属性实例中获取"My String Data"

BadCustomAttribute attr = typeof(DecoratedClass)
    .GetCustomAttributes(typeof(BadCustomAttribute), false)
    .Single() as BadCustomAttribute;

现在您拥有属性的实例,但无法读取传递给构造函数的字符串,因为您至少没有为它声明只读属性。

答案 3 :(得分:1)

这个想法是你应该只写:

[AttributeUsage(AttributeTargets.Property)]
public sealed class ExampleAttribute : Attribute
{
    public ExampleAttribute(string attributeValue)
    {
        this.AttributeValue = attributeValue;
    }

    public string AttributeValue
    {
        get;
        set;
    }
}

答案 4 :(得分:0)

当参数名称与属性名称匹配时,也会抛出此违规,但数据类型不同。