É possível criar um atributo que pode ser inicializado com um número variável de argumentos?
Por exemplo:
[MyCustomAttribute(new int[3,4,5])] // this doesn't work
public MyClass ...
c#
attributes
Crono
fonte
fonte
Respostas:
Os atributos terão uma matriz. Porém, se você controlar o atributo, também poderá usar
params
(o que é mais agradável para os consumidores, IMO):Acontece que sua sintaxe para a criação de array está errada:
fonte
Você pode fazer isso, mas não é compatível com CLS:
Programas:
Para uso de reflexão regular, pode ser preferível ter vários atributos, ou seja,
No entanto, isso não funcionará com
TypeDescriptor
/PropertyDescriptor
, onde apenas uma única instância de qualquer atributo é suportada (a primeira ou a última vence, não consigo lembrar qual).fonte
Tente declarar o construtor assim:
Então você pode usá-lo como:
[MyCustomAttribute(3, 4, 5)]
fonte
Isso deve ficar bem. A partir das especificações, seção 17.2:
Uma expressão E é uma expressão de argumento de atributo se todas as seguintes afirmações forem verdadeiras:
Aqui está um exemplo:
fonte
Sim, mas você precisa inicializar o array que está passando. Aqui está um exemplo de um teste de linha em nossos testes de unidade que testa um número variável de opções de linha de comando;
fonte
Você pode fazer isso. Outro exemplo poderia ser:
fonte
Para pegar carona na resposta de Marc Gravell, sim, você pode definir um atributo com parâmetros de matriz, mas aplicar um atributo com um parâmetro de matriz não é compatível com CLS. No entanto, apenas definir um atributo com uma propriedade de array é perfeitamente compatível com CLS.
O que me fez perceber isso foi que Json.NET, uma biblioteca compatível com CLS, tem uma classe de atributo JsonPropertyAttribute com uma propriedade chamada ItemConverterParameters que é uma matriz de objetos.
fonte