Lo he intentado muchas veces, pero todavía no puedo entender el uso de atributos personalizados (ya he revisado muchos enlaces).
¿Alguien puede explicarme un ejemplo muy básico de un atributo personalizado con código?
fuente
Lo he intentado muchas veces, pero todavía no puedo entender el uso de atributos personalizados (ya he revisado muchos enlaces).
¿Alguien puede explicarme un ejemplo muy básico de un atributo personalizado con código?
Si bien el código para crear un atributo personalizado es bastante simple, es muy importante que comprenda qué atributos son:
Los atributos son metadatos compilados en su programa. Los atributos en sí mismos no agregan ninguna funcionalidad a una clase, propiedad o módulo, solo datos. Sin embargo, usando la reflexión, uno puede aprovechar esos atributos para crear funcionalidad.
Entonces, por ejemplo, veamos el Bloque de aplicación de validación , de la Biblioteca empresarial de Microsoft . Si observa un ejemplo de código, verá:
/// <summary>
/// blah blah code.
/// </summary>
[DataMember]
[StringLengthValidator(8, RangeBoundaryType.Inclusive, 8, RangeBoundaryType.Inclusive, MessageTemplate = "\"{1}\" must always have \"{4}\" characters.")]
public string Code { get; set; }
A partir del fragmento anterior, se podría suponer que el código siempre se validará, siempre que se cambie, de acuerdo con las reglas del Validador (en el ejemplo, tenga al menos 8 caracteres y como máximo 8 caracteres). Pero la verdad es que el atributo no hace nada; como se mencionó anteriormente, solo agrega metadatos a la propiedad.
Sin embargo, Enterprise Library tiene un Validation.Validate
método que examinará su objeto y, para cada propiedad, verificará si el contenido viola la regla informada por el atributo.
Entonces, así es como debe pensar acerca de los atributos: una forma de agregar datos a su código que luego podrían ser utilizados por otros métodos / clases / etc.
Empiece escribiendo una clase que se derive de Attribute :
Entonces podrías decorar cualquier cosa (clase, método, propiedad, ...) con este atributo:
y finalmente usarías la reflexión para buscarlo:
Puede limitar los tipos de destino a los que se puede aplicar este atributo personalizado mediante el atributo AttributeUsage :
Cosas importantes que debe saber sobre los atributos:
fuente
var value = typeof(Foo).GetCustomAttributes<MyCustomAttribute>().First().SomeProperty;
Utilizando / copiando la gran respuesta de Darin Dimitrov , así es como acceder a un atributo personalizado en una propiedad y no en una clase:
La propiedad decorada [de clase
Foo
]:Obteniéndolo:
También puede lanzar esto en un bucle y usar la reflexión para acceder a este atributo personalizado en cada propiedad de la clase
Foo
:Muchas gracias a ti, Darin !!
fuente
object[] attribute = propertyInfo.GetCustomAttributes(typeof(???), true);
Solo quiero iterar sobre todos ellos y llamar a un métodom1()
de cada atributo desconocidoLa respuesta corta es para crear un atributo en c #, solo necesita heredarlo de la clase Attribute, solo esto :)
Pero aquí voy a explicar los atributos en detalle:
básicamente los atributos son clases que podemos usarlos para aplicar nuestra lógica a ensamblajes, clases, métodos, propiedades, campos, ...
En .Net, Microsoft ha proporcionado algunos atributos predefinidos como Obsolete o Validation Attributes como ([Required], [StringLength (100)], [Range (0, 999.99)]), también tenemos atributos como ActionFilters en asp.net que puede ser muy útil para aplicar nuestra lógica deseada a nuestros códigos (lea este artículo sobre filtros de acción si le apasiona aprenderlo)
otro punto, puede aplicar un tipo de configuración en su atributo a través de AttibuteUsage.
Cuando decora una clase de atributo con AttributeUsage, puede decirle al compilador de c # dónde voy a usar este atributo: voy a usar esto en clases, en ensamblajes en propiedades o en ... y mi atributo puede usar varias veces en objetivos definidos (clases, ensamblajes, propiedades, ...) o no ?!
Después de esta definición sobre atributos, les voy a mostrar un ejemplo: Imagine que queremos definir una nueva lección en la universidad y queremos permitir que solo los administradores y maestros de nuestra universidad definan una nueva lección, ¿de acuerdo?
En el mundo real de la programación, tal vez no usemos este enfoque para usar atributos y lo dije por su punto educativo en el uso de atributos.
fuente