CA1019: Определите метод доступа для аргумента атрибута. Я не понимаю причину - PullRequest
2 голосов
/ 22 декабря 2010

Сегодня я очищал часть своего кода с помощью FXCop, и он жаловался на класс Attribute, который у меня был с этим нарушением.

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;
        }
    }
}

Вместо частного поля я использовал общедоступное автообъект, мне пришлось добавить последнюю часть, чтобы остановить предупреждение, но я не вижу смысла, и он также добавляет другое открытое поле в этот класс, который является избыточным и кажется менее чистым.

Тем не менее, я предполагаю, что это предупреждение выдвинуто по какой-то причине, так что за веская причина, по которой я здесь скучаю?

Заранее спасибо.

Ответы [ 5 ]

7 голосов
/ 22 декабря 2010

FxCop жалуется, потому что ваше существующее свойство не соответствует имени параметра.
Следовательно, он не понимает, что параметр фактически выставлен.

Вам следует переименовать свойство или параметр для соответствия (кроме регистра) или отключить предупреждение.

3 голосов
/ 22 декабря 2010

Правило FxCop CA1019 просто обеспечивает соблюдение рекомендаций по кодированию .Net Framework для атрибутов.

Использовать именованные аргументы (свойства чтения / записи) для необязательных параметров. Укажите свойство чтения / записи с тем же именем, что и у каждого именованного аргумента, но измените регистр, чтобы различать их.

Ссылка на документацию: http://msdn.microsoft.com/en-us/library/2ab31zeh(v=vs.71).aspx

2 голосов
/ 22 декабря 2010

Причина предупреждения FxCop заключается в том, что каждый фрагмент данных, который вы передаете в конструктор атрибута, должен быть общедоступным для доступа при получении экземпляра атрибута с помощью Reflection.

Допустим, у вас есть это:

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

Как вы получите "My String Data" обратно из этого экземпляра атрибута, когда прочитаете его, используя:

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

Теперь у вас есть экземпляр вашего атрибута, , но нетспособ прочитать строку, переданную в конструктор , потому что вы по крайней мере не объявили свойство только для чтения.

1 голос
/ 22 декабря 2010

Идея в том, что вы должны написать просто:

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

    public string AttributeValue
    {
        get;
        set;
    }
}
0 голосов
/ 28 сентября 2012

Это нарушение также возникает, когда имя параметра соответствует имени свойства, но типы данных различаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...