2011-02-03 17 views
10

He escrito un atributo personalizado que uso en ciertos miembros de una clase:¿Obtiene el valor de una propiedad personalizada con atributo decorado?

public class Dummy 
{ 
    [MyAttribute] 
    public string Foo { get; set; } 

    [MyAttribute] 
    public int Bar { get; set; } 
} 

soy capaz de obtener los atributos personalizados del tipo y encontrar mi atributo específico. Lo que no puedo entender es cómo obtener los valores de las propiedades asignadas. Cuando tomo una instancia de Dummy y la paso (como un objeto) a mi método, ¿cómo puedo tomar el objeto PropertyInfo que obtengo de .GetProperties() y obtener los valores asignados a .Foo y .Bar?

EDIT:

Mi problema es que no puedo encontrar la manera de llamar adecuadamente GetValue.

void TestMethod (object o) 
{ 
    Type t = o.GetType(); 

    var props = t.GetProperties(); 
    foreach (var prop in props) 
    { 
     var propattr = prop.GetCustomAttributes(false); 

     object attr = (from row in propattr where row.GetType() == typeof(MyAttribute) select row).First(); 
     if (attr == null) 
      continue; 

     MyAttribute myattr = (MyAttribute)attr; 

     var value = prop.GetValue(prop, null); 
    } 
} 

Sin embargo, cuando hago esto, la llamada prop.GetValue me da un TargetException - El objeto no coincide con el tipo de destino. ¿Cómo estructurar esta llamada para obtener este valor?

Respuesta

11

Su necesidad de hacerse pasar objetos a GetValue, no un objeto de propiedad:

var value = prop.GetValue(o, null); 

Y una cosa más: debe usar no .Primero(), sino .FirstOrDefault(), porque su código arrojará una exc eption, si alguna propiedad no contiene ningún atributo:

object attr = (from row in propattr 
       where row.GetType() == typeof(MyAttribute) 
       select row) 
       .FirstOrDefault(); 
+0

Acuerdo en FirstOrDefault: este es principalmente un ejemplo artificial para demostrar el problema, pero gracias por la ayuda. Duh, no puedo creer que fue eso. – Joe

3

Se obtiene gama de PropertyInfo usando .GetProperties() y llamar PropertyInfo.GetValue Método para cada

llamada de esta manera:

var value = prop.GetValue(o, null); 
+0

Para aclarar; el OP necesitará una instancia de la clase Dummy para obtener un valor de propiedad de ella. Un tipo en sí mismo no es suficiente. – KeithS

+0

He actualizado mi pregunta: mi problema es exactamente con .GetValue y cómo llamarlo para que realmente funcione. – Joe

+1

@Joe ver actualización – Andrey

Cuestiones relacionadas