Tengo una clase, llamémosla Libro con una propiedad llamada Nombre. Con esa propiedad, tengo un atributo asociado.
public class Book
{
[Author("AuthorName")]
public string Name
{
get; private set;
}
}
En mi método principal, estoy usando la reflexión y deseo obtener un par de valores clave de cada atributo para cada propiedad. Entonces, en este ejemplo, esperaría ver "Autor" para el nombre del atributo y "AuthorName" para el valor del atributo.
Pregunta: ¿Cómo obtengo el nombre y el valor del atributo en mis propiedades usando Reflection?
c#
reflection
propertyinfo
desarrollador
fuente
fuente
Respuestas:
Se usa
typeof(Book).GetProperties()
para obtener una variedad dePropertyInfo
instancias. Luego useGetCustomAttributes()
en cada unoPropertyInfo
para ver si alguno de ellos tiene elAuthor
tipo de Atributo. Si lo hacen, puede obtener el nombre de la propiedad de la información de la propiedad y los valores de los atributos del atributo.Algo a lo largo de estas líneas para escanear un tipo de propiedades que tienen un tipo de atributo específico y para devolver datos en un diccionario (tenga en cuenta que esto se puede hacer más dinámico al pasar los tipos a la rutina):
fuente
Para obtener todos los atributos de una propiedad en un diccionario, use esto:
recuerde cambiar de
false
atrue
si desea incluir también atributos heredados.fuente
Si solo desea un valor de Atributo específico. Por ejemplo, Mostrar Atributo, puede usar el siguiente código:
fuente
He resuelto problemas similares escribiendo un Asistente de atributos de propiedad de extensión genérica:
Uso:
fuente
Fields
?Puedes usar
GetCustomAttributesData()
yGetCustomAttributes()
:fuente
Si quiere decir "para los atributos que toman un parámetro, enumere los nombres de los atributos y el valor del parámetro", esto es más fácil en .NET 4.5 a través de la
CustomAttributeData
API:fuente
fuente
Si bien las respuestas más votadas anteriormente definitivamente funcionan, sugeriría usar un enfoque ligeramente diferente en algunos casos.
Si su clase tiene varias propiedades con siempre el mismo atributo y desea ordenar esos atributos en un diccionario, así es como:
Esto todavía usa la conversión, pero asegura que la conversión siempre funcionará, ya que solo obtendrá los atributos personalizados del tipo "AuthorName". Si tuviera múltiples Atributos las respuestas anteriores obtendrían una excepción de lanzamiento.
fuente
Uso:
o:
fuente
Aquí hay algunos métodos estáticos que puede usar para obtener MaxLength o cualquier otro atributo.
Usando el método estático ...
O usando el método de extensión opcional en una instancia ...
O usando el método estático completo para cualquier otro atributo (StringLength por ejemplo) ...
Inspirado por la respuesta de Mikael Engver.
fuente
Nigromancia
Para aquellos que todavía tienen que mantener .NET 2.0, o aquellos que quieren hacerlo sin LINQ:
Ejemplo de uso:
o simplemente
fuente
En este ejemplo, usé DisplayName en lugar de Author porque tiene un campo llamado 'DisplayName' que se muestra con un valor.
fuente
para obtener un atributo de enum, estoy usando:
// Utilizando
fuente
Solo estoy buscando el lugar correcto para poner este código.
Digamos que tiene la siguiente propiedad:
Y desea obtener el valor ShortName. Tu puedes hacer:
O para hacerlo general:
fuente