2008-12-24 17 views
18

Estoy tratando de construir un objeto a través de un atributo en una propiedad clases que especifica una columna de una fila de datos suministrada que es el valor de la propiedad, de la siguiente manera:C establecer valores de propiedades a través de la reflexión con los atributos #

[StoredDataValue("guid")] 
    public string Guid { get; protected set; } 

    [StoredDataValue("PrograGuid")] 
    public string ProgramGuid { get; protected set; } 

en un método de construcción() en un objeto de base, estoy consiguiendo los valores de los atributos establecidos en estas propiedades como

 MemberInfo info = GetType(); 
     object[] properties = info.GetCustomAttributes(true); 

Sin embargo, en este momento me estoy dando cuenta de la limitación de mis conocimientos.

Para empezar, no parece estar recuperando los atributos correctos.

¿Y cómo configuro estas propiedades mediante la reflexión, ahora que tengo los atributos? ¿Estoy haciendo/pensando algo fundamentalmente incorrecto?

Respuesta

38

Hay un par de cuestiones distintas aquí

  • typeof(MyClass).GetCustomAttributes(bool) (o GetType().GetCustomAttributes(bool)) devuelve los atributos de la clase en sí, no a los atributos de los miembros. Deberá invocar typeof(MyClass).GetProperties() para obtener una lista de propiedades en la clase y luego verificar cada una de ellas.

  • Una vez que haya obtenido la propiedad, creo que debería usar Attribute.GetCustomAttribute() en lugar de MemberInfo.GetGustomAttributes() ya que sabe exactamente qué atributo está buscando.

aquí hay un pequeño fragmento de código para ayudarle a empezar:

PropertyInfo[] properties = typeof(MyClass).GetProperties(); 
foreach(PropertyInfo property in properties) 
{ 
    StoredDataValueAttribute attribute = 
     Attribute.GetCustomAttribute(property, typeof(StoredDataValueAttribute)) as StoredDataValueAttribute; 

    if (attribute != null) // This property has a StoredDataValueAttribute 
    { 
     property.SetValue(instanceOfMyClass, attribute.DataValue, null); // null means no indexes 
    } 
} 

EDITAR: No hay que olvidar que Type.GetProperties() solamente devuelve las propiedades públicas de forma predeterminada. Deberá usar Type.GetProperties(BindingFlags) para obtener otros tipos de propiedades también.

+0

Haré una prueba y le dejaré saber, aunque parece lógico – johnc

+0

Attribute.GetCustomAttribute (...) devuelve una matriz de System.Attribute y no se puede simplemente convertir al atributo en sí. El ejemplo que se muestra ni siquiera compila ni mucho menos funciona. Debe probar la longitud de la matriz para ver si existe el atributo deseado y, en su lugar, convertir el primer elemento al tipo requerido. –

+0

El ejemplo usa GetCustomAttribute, no GetCustomAttributes. El ejemplo se compila cuando lo intento (por supuesto, cambiar el nombre del atributo). –

Cuestiones relacionadas