property net method example custom attributetargets attribute asp c# custom-attributes attributeusage

c# - net - ¿Por qué querría uno usar AttributeUsage AllowMultiple al crear atributos?



custom attributes property c# (5)

Aplicación en el mundo real del atributo AllowMultiple = utilidad verdadera

[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()

Le di la vuelta a AllowMultiple = true más temprano hoy para permitir que el atributo ManagesType se use más de una vez. Tenemos varios cientos de clases de colección personalizada. La mayoría de estas colecciones personalizadas tienen una vista que se hereda de CustomView, diseñada para manejar la creación de una vista de UI para un tipo específico de colección personalizada y presentársela al usuario. El atributo ManagesType se usa a través de la reflexión para crear un diccionario de CADA Vista en nuestra aplicación que se hereda de CustomView para "registrar" qué tipo de objeto fue diseñado para manejar. LibSpecSelectionView "rompió ese patrón" al mostrar dos colecciones diferentes al mismo tiempo (crea dos pestañas y muestra una colección personalizada en una pestaña y la otra en la segunda pestaña) Por lo tanto, la misma vista es capaz de manejar dos colecciones personalizadas diferentes. El diccionario cuyas vistas son capaces de manejar qué tipos de colección se aprovechan a través de un método de extensión para permitir que cualquiera de nuestras colecciones personalizadas inicie la vista registrada (o una predeterminada si no hay una vista "registrada") a través de una línea. llamar al administrador de la vista.

Según un libro que estoy leyendo, la propiedad pública AllowMultiple de AttributeUsage especifica:

... si el destino puede tener múltiples instancias del atributo aplicado.

¿Por qué querría / no quiero usar esto?


Este ejemplo puede ser un poco artificial, pero es de esperar que se lo explique.

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


Esto depende de cuales sean los atributos.

Por ejemplo, podría hacer un atributo que marque una clase según algo y podría permitir múltiples dependencias.

Para un ejemplo concreto, mire SuppressMessage , que suprime una advertencia de análisis de código. Un miembro puede tener varias advertencias que es posible que desee suprimir.

Otro ejemplo es WebResource ; Un ensamblaje puede contener múltiples recursos.


Los atributos son metadatos. Por lo general, deseará decorar un miembro o un tipo con un atributo para rastrear cierta información sobre él.

Por ejemplo, el atributo de descripción es usado por PropertyGrid para etiquetar una descripción de una propiedad:

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

La mayoría de las veces, tener más de una descripción no tendría sentido.

Sin embargo, es posible que un atributo específico tenga sentido usarlo más de una vez. En ese caso, desearía configurar el Atributo para permitir que varias instancias de sí mismo se etiqueten en el mismo atributo.

(No es que haría esto, pero ...) Supongamos que creaste un atributo personalizado para rastrear cambios importantes en una clase. Es posible que desee enumerar esto para cada cambio importante:

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


No tengo un ejemplo artificial, lo utilicé en código de producción real. Escribí un código para analizar un archivo que contiene pares de datos como (código = valor). Puse un atributo personalizado en una función para indicar que se debe llamar para un código dado.

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

Este formato en particular es un tanto antiguo y específico del dominio con cientos de códigos diferentes. Mi objetivo era escribir un marco para facilitar la escritura de procesadores de archivos que pudieran extraer solo los códigos que necesita e ignorar el resto. Permitir el mismo atributo varias veces facilitó la expresión del intento del código simplemente declarando atributos en las funciones que procesan cada código.