Поделиться через


CA1019: необходимо определять методы доступа для аргументов атрибутов

TypeName

DefineAccessorsForAttributeArguments

CheckId

CA1019

Категория

Microsoft.Design

Критическое изменение

Не критическое

Причина

В своем конструкторе атрибут определяет аргументы, не имеющие соответствующих свойств.

Описание правила

Атрибуты могут определять обязательные аргументы, которые должны быть указаны при применении атрибута к целевому объекту. Они также известны как позиционные аргументы, поскольку предоставляются для конструкторов атрибутов в качестве позиционных параметров. Для каждого обязательного аргумента атрибут должен предоставлять соответствующее свойство, доступное только для чтения, чтобы извлечь значение аргумента во время выполнения. Это правило используется для проверки того, что для каждого параметра конструктора определено соответствующее свойство.

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

Для обязательных и необязательных аргументов соответствующие свойства и параметры конструктора должны иметь одинаковые имена, написанные в разных регистрах. Для свойств используется стиль Pascal, а для параметров — Camel.

Устранение нарушений

Чтобы устранить нарушение данного правила, для каждого параметра конструктора добавьте свойство, доступное только для чтения (если таковое отсутствует).

Отключение предупреждений

Если значение обязательного аргумента не должно быть извлекаемым, отключите вывод предупреждения для данного правила.

Пример настраиваемых атрибутов

Описание

В следующем примере показаны два атрибута, определяющих обязательный (позиционный) параметр. Первая реализация атрибута определена неправильно. Вторая реализация является верной.

Код

Imports System

Namespace DesignLibrary

' Violates rule: DefineAccessorsForAttributeArguments.
<AttributeUsage(AttributeTargets.All)>  _
NotInheritable Public Class BadCustomAttribute
    Inherits Attribute
    Private data As String

    ' Missing the property that corresponds to 
    ' the someStringData parameter.
    Public Sub New(someStringData As String)
        data = someStringData
    End Sub 'New
End Class 'BadCustomAttribute

' Satisfies rule: Attributes should have accessors for all arguments.
<AttributeUsage(AttributeTargets.All)>  _
NotInheritable Public Class GoodCustomAttribute
    Inherits Attribute
    Private data As String

    Public Sub New(someStringData As String)
        data = someStringData
    End Sub 'New

    'The constructor parameter and property
    'name are the same except for case.

    Public ReadOnly Property SomeStringData() As String
        Get
            Return data
        End Get
    End Property
End Class 

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

Позиционные и именованные аргументы

Описание

Позиционные и именованные аргументы упрощают определение обязательных и необязательных аргументов атрибута для пользователей библиотеки.

В следующем примере приведена реализация атрибута, имеющего позиционные и именованные атрибуты.

Код

using System; 

namespace DesignLibrary
{    
    [AttributeUsage(AttributeTargets.All)]        
    public sealed class GoodCustomAttribute : Attribute    
    {        
        string mandatory;        
        string optional;         

        public GoodCustomAttribute(string mandatoryData)        
        {            
            mandatory = mandatoryData;        
        }         

        public string MandatoryData        
        {            
            get { return mandatory; }        
        }         

        public string OptionalData        
        {            
            get { return optional; }            
            set { optional = value; }        
        }    
    }
}

Комментарии

В следующем примере показано применение настраиваемого атрибута к двум свойствам.

Код

[GoodCustomAttribute("ThisIsSomeMandatoryData", OptionalData = "ThisIsSomeOptionalData")]
public string MyProperty
{
    get { return myProperty; }
    set { myProperty = value; }
}

[GoodCustomAttribute("ThisIsSomeMoreMandatoryData")]
public string MyOtherProperty
{
    get { return myOtherProperty; }
    set { myOtherProperty = value; }
}

Связанные правила

CA1813: не допускайте использования распечатанных атрибутов

См. также

Ссылки

Правила использования атрибутов