¿Es posible crear un atributo que se pueda inicializar con un número variable de argumentos?
Por ejemplo:
[MyCustomAttribute(new int[3,4,5])] // this doesn't work
public MyClass ...
c#
attributes
Crono
fuente
fuente
Respuestas:
Los atributos tomarán una matriz. Aunque si controla el atributo, también puede usar
params
en su lugar (que es más agradable para los consumidores, en mi opinión):Su sintaxis para la creación de matrices simplemente está desactivada:
fuente
Puede hacerlo, pero no cumple con CLS:
Muestra:
Para el uso de reflexión regular, puede ser preferible tener múltiples atributos, es decir
Sin embargo, esto no funcionará con
TypeDescriptor
/PropertyDescriptor
, donde solo se admite una única instancia de cualquier atributo (ya sea la primera o la última victoria, no recuerdo cuál).fuente
Intenta declarar el constructor así:
Entonces puedes usarlo como:
[MyCustomAttribute(3, 4, 5)]
fuente
Eso debería estar bien. De la especificación, sección 17.2:
Una expresión E es una expresión -argumento-atributo si todas las siguientes afirmaciones son verdaderas:
He aquí un ejemplo:
fuente
Sí, pero necesita inicializar la matriz que está pasando. Aquí hay un ejemplo de una prueba de fila en nuestras pruebas unitarias que prueba un número variable de opciones de línea de comando;
fuente
Usted puede hacer eso. Otro ejemplo podría ser:
fuente
Para aprovechar la respuesta de Marc Gravell, sí, puede definir un atributo con parámetros de matriz, pero aplicar un atributo con un parámetro de matriz no es compatible con CLS. Sin embargo, simplemente definir un atributo con una propiedad de matriz es perfectamente compatible con CLS.
Lo que me hizo darme cuenta de esto fue que Json.NET, una biblioteca compatible con CLS, tiene una clase de atributo JsonPropertyAttribute con una propiedad llamada ItemConverterParameters que es una matriz de objetos.
fuente