Definir acessadores para argumentos de atributo
TypeName |
DefineAccessorsForAttributeArguments |
CheckId |
CA1019 |
Category (Categoria) |
Microsoft.Design |
Quebrando alterar |
Não separável |
Causa
Em seu construtor, um atributo define argumentos que não têm propriedades correspondentes.
Descrição da regra
Atributos podem definir argumentos obrigatórios que devem ser especificados quando você aplicar o atributo para um destino.Eles também são conhecidos sistema autônomo argumentos posicionais porque eles são fornecidos para construtores de atributo sistema autônomo parâmetros de posição.Para cada argumento obrigatório, o atributo também deve fornecer uma propriedade somente leitura correspondente para que o valor do argumento pode ser recuperado em time de execução.Esta regra verifica que, para cada parâmetro de construtor, você definiu a propriedade correspondente.
Atributos também podem definir argumentos opcionais, que também são conhecidos sistema autônomo argumentos nomeados.Esses argumentos são fornecidos para construtores de atributo pelo nome e devem ter uma propriedade de leitura/gravar correspondente.
Para argumentos obrigatórios e opcionais, as propriedades correspondentes e os parâmetros do construtor devem usar o mesmo nome mas diferente de maiúsculas e minúsculas.Propriedades, use Pascal casing e parâmetros de uso camel casing.
Como corrigir violações
Para corrigir uma violação dessa regra, adicione uma propriedade somente leitura para cada parâmetro de construtor que não tenha um.
Quando suprimir avisos
Elimina um aviso essa regra se não quiser que o valor do argumento obrigatório a ser recuperáveis.
Exemplo de atributos personalizados
Descrição
O exemplo a seguir mostra dois atributos que definem um parâmetro obrigatório (Posicional).A primeira implementação do atributo é definida incorretamente.A implementação segunda está correta.
Código
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;
}
}
}
}
Argumentos posicionais e nomeados
Descrição
Argumentos posicionais e nomeados fazer desmarcar aos consumidores da sua biblioteca, quais argumentos são obrigatórios para o atributo e quais argumentos são opcionais.
O exemplo a seguir mostra uma implementação de um atributo que possui os argumentos posicionais e nomeados.
Código
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; }
}
}
}
Comentários
O exemplo a seguir mostra como aplicar o atributo personalizado para duas propriedades.
Código
[GoodCustomAttribute("ThisIsSomeMandatoryData", OptionalData = "ThisIsSomeOptionalData")]
public string MyProperty
{
get { return myProperty; }
set { myProperty = value; }
}
[GoodCustomAttribute("ThisIsSomeMoreMandatoryData")]
public string MyOtherProperty
{
get { return myOtherProperty; }
set { myOtherProperty = value; }
}