Pergunta

De acordo com um livro que estou lendo, a propriedade pública AllowMultiple de especifica AttributeUsage:

... se o alvo pode ter várias instâncias do atributo aplicado a ele.

Por que eu quero / não quero usar isso?

Foi útil?

Solução

Os atributos são meta-dados. Normalmente, você quer decorar um membro ou tipo com um atributo a fim de acompanhar algumas informações sobre ele.

Por exemplo, o DescriptionAttribute é usado pelo PropertyGrid para rotular uma descrição de uma propriedade:

[Description("This is my property")]
public int MyProperty { get; set; }

Na maioria das vezes, ter mais do que uma descrição não faria sentido.

No entanto, é possível que um atributo específico faz sentido usar mais de uma vez. Nesse caso, você gostaria de definir o atributo para permitir que várias instâncias de si mesmo marcado para o mesmo atributo.

(Não que eu faria isso, mas ...) Digamos que você fez um atributo personalizado para rastrear grandes mudanças para a classe. Você pode querer listar isso para cada mudança importante:

[Changes(Version=1.1, Change="Added Foo Feature")]
[Changes(Version=2.0, Change="Added Bar Feature")]
public class MyClass
{
    // ...

Outras dicas

Este exemplo pode ser um pouco artificial, mas espero que ele recebe o ponto de vista.

[Convertable(typeof(Int32)), Convertable(typeof(Double))]
public class Test
{

}

Este depende do que os atributos são.

Por exemplo, você poderia fazer um atributo que marca uma classe como dependente de alguma coisa, e você poderia permitir que várias dependências.

Para um exemplo concreto, olhada SuppressMessage , que suprime um aviso de análise de código. Um membro pode ter vários avisos de que você pode querer suprimir.

Outro exemplo é WebResource ; uma montagem pode conter vários recursos.

No inventado exemplo aqui, eu usei-o no código de produção real. Eu escrevi algum código para analisar um arquivo contendo pares de dados como (code = valor). Eu coloquei um atributo personalizado em uma função para indicar que deve ser chamado para um determinado código.

[CanParseCode("G1")]
[CanParseCode("G2")]
private void ParseGXCodes(string code, string value)
{
   ...
}

Este formato especial, é um pouco velho e domínio específico com centenas de códigos diferentes. Meu objetivo era escrever um quadro para torná-lo mais fácil de escrever processadores de arquivo que poderia extrair apenas os códigos que necessita e ignorar o resto. Permitindo que o mesmo atributo várias vezes tornou fácil para expressar a intenção do código, basta declarar atributos sobre a função (s) que processar cada código.

Real Application Mundial de Atributo AllowMultiple = verdadeira utilidade

[ManagesType(typeof(SPEC_SEC_OC), true)]
[ManagesType(typeof(SPEC_SEC_04_OC), true)]
public class LibSpecSelectionView : CustomView
{
    public LibSpecSelectionView(SPEC_SEC_OC)
    {}
    public LibSpecSelectionView(SPEC_SEC_O4_OC)
    {}
    ....
}

public static class ViewManager
{
   ...  static Dictionary of views built via reflection
   public void LaunchView(this CollectionBaseClass cbc)
   {
       ... Find class registered to handle cbc type in dictionary and call ctor
   }
}

SPEC_SEC_OC myOC = DataClient.Instance.GetSPEC_SEC_OC();
myOC.LaunchView()

Virei AllowMultiple = true hoje mais cedo para permitir o atributo ManagesType para ser usado mais de uma vez. Temos várias centenas de Classes de coleção personalizada. A maioria dessas coleções personalizadas têm uma visão que herda de CustomView projetado para criação cabo de uma vista UI para um tipo específico de coleção personalizada e apresentá-lo para o usuário. O atributo ManagesType é usado através da reflexão para construir um dicionário de cada exibição em nosso aplicativo que herda de CustomView para "registrar" o tipo de objeto que foi projetado para alça. O LibSpecSelectionView "quebrou esse padrão", exibindo dois conjuntos de diferentes ao mesmo tempo (cria duas abas e programas de recolha de um costume em uma guia e o outro no segundo separador) para que o mesmo ponto de vista é capaz de lidar com dois conjuntos de diferentes mercadorias. O dicionário dos quais vistas são capazes de lidar com que tipos de coleção é então alavancado através de um método de extensão para permitir uma das nossas coleções personalizadas para lançar a visão registrada (ou um padrão se não houver uma visão "registrado") através de uma linha ligar para o gerente vista.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top