2012-04-25 20 views
5

Estoy tratando de usar GetCustomAttributes() para obtener un atributo definido en una propiedad. El problema es que la propiedad está anulada y no puedo encontrar la forma de extraer la sobrescrita de la expresión. Solo puedo averiguar cómo obtener el de la clase base.Obtener el atributo de la propiedad anulada mediante un linq Expresión

Aquí hay un código

public class MyAttribute : Attribute 
{ 
    //... 
} 

public abstract class Text 
{ 
    public abstract string Content {get; set;} 
} 

public class Abstract : Text 
{ 
    [MyAttribute("Some Info")] 
    public override string Content {get; set;} 
} 

Ahora estoy tratando de conseguir el MyAttribute fuera de la clase abstracta. Pero necesito obtenerlo a través de Expression. Esto es lo que he estado usando:

Expression<Func<Abstract, string>> expression = c => c.Content; 
Expression exp = expression.Body; 
MemberInfo memberType = (exp as MemberExpression).Member; 

var attrs = Attribute.GetCustomAttributes(memberType, true); 

Desafortunadamente atts termina como vacía. El problema es que menberType termina siendo para Text.Content en lugar de la clase Abstract.Content. Entonces, cuando obtengo los atributos, no devuelve nada.

Respuesta

3

No funciona porque MemberExpression ignora las modificaciones y devuelve la propiedad del tipo base Text por lo que no encuentra su atributo.

Usted puede leer acerca de este problema aquí: How to get the child declaring type from an expression?

Sin embargo, usted tiene toda la información en la expresión y se puede obtener el atributo con un poco más de reflexión (muestra rápido y sucio):

Expression<Func<Abstract, string>> expression = (Abstract c) => c.Content; 
Expression exp = expression.Body; 
MemberInfo memberType = (exp as MemberExpression).Member; 

var attrs = Attribute.GetCustomAttributes(
expression.Parameters[0].Type.GetProperty(memberType.Name)); 
+0

Gracias por el enlace a la otra pregunta. Busqué algo similar pero no encontré ese. – Jero

+0

Esa solución que diste es el trabajo que he estado usando hasta ahora tan agradable para obtener un soporte independiente para eso :-) Gracias – Jero

Cuestiones relacionadas