2010-08-24 21 views
8

Estoy creando una lista de propiedades de un tipo para incluir en una exportación de una colección de ese tipo. Me gustaría hacer esto sin usar cadenas de nombres de propiedades. Solo ciertas propiedades del tipo deben incluirse en la lista. Me gustaría hacer algo como:Seleccione una propiedad de modelo utilizando un nombre de propiedad de cadena lambda y no de cadena

exportPropertyList<JobCard>.Add(jc => jc.CompletionDate, "Date of Completion"); 

¿Cómo puedo implementar este método genérico Agregar? Por cierto, la cadena es la descripción de la propiedad.

Respuesta

9

Usted puede obtener el objeto PropertyInfo mediante el examen de la Expresión aprobada en algo como:.

public void Add<T>(Expression<Func<T,object>> expression, string displayName) 
{ 
    var memberExpression = expression.Body as MemberExpression; 
    PropertyInfo prop = memberExpression.Member as PropertyInfo; 
    // Add property here to some collection, etc ? 
} 

Esta es una implementación incompleto, porque no sé qué es exactamente lo que quiere hacer con la propiedad - pero muestra cómo obtener PropertyInfo de una Expresión: el objeto PropertyInfo contiene todos los metadatos sobre la propiedad. Además, asegúrese de agregar el manejo de errores a lo anterior antes de aplicarlo en el código de producción (es decir, evita que la expresión sea miembroExpresión, etc.).

+0

¡Gracias! Fue el parámetro * object * de ** Func ** lo que me dejó perplejo. – ProfK

+0

No hay problema: recuerde marcar la respuesta como aceptada si la respuesta resolvió su problema :-) – driis

0

Una configuración del selector superior, se ve así:

public void MethodConsumingSelector<TContainer, TSelected>(Expression<Func<TContainer, TSelected>> selector) 
{ 
    var memberExpresion = expression.Body as MemberExpression; 
    var propertyInfo = memberExpression.Member as PropertyInfo; 
} 

Esto impide la expresión que se pasa desde ser un UnaryExpression contiene Convert(x => x.ValueTypeProperty) cuando el selector se dirige a un tipo de valor.

Consulte la pregunta relacionada con UnaryExpression versus MemberExpression en SO here.

Cuestiones relacionadas