Esto se puede lograr utilizando las expresiones:
// requires object instance, but you can skip specifying T
static string GetPropertyName<T>(Expression<Func<T>> exp)
{
return (((MemberExpression)(exp.Body)).Member).Name;
}
// requires explicit specification of both object type and property type
static string GetPropertyName<TObject, TResult>(Expression<Func<TObject, TResult>> exp)
{
// extract property name
return (((MemberExpression)(exp.Body)).Member).Name;
}
// requires explicit specification of object type
static string GetPropertyName<TObject>(Expression<Func<TObject, object>> exp)
{
var body = exp.Body;
var convertExpression = body as UnaryExpression;
if(convertExpression != null)
{
if(convertExpression.NodeType != ExpressionType.Convert)
{
throw new ArgumentException("Invalid property expression.", "exp");
}
body = convertExpression.Operand;
}
return ((MemberExpression)body).Member.Name;
}
Uso:
var x = new ObjectType();
// note that in this case we don't need to specify types of x and Property1
var propName1 = GetPropertyName(() => x.Property1);
// assumes Property2 is an int property
var propName2 = GetPropertyName<ObjectType, int>(y => y.Property2);
// requires only object type
var propName3 = GetPropertyName<ObjectType>(y => y.Property3);
Actualización: fijo GetPropertyName<TObject>(Expression<Func<TObject, object>> exp)
para las propiedades que regresan tipos de valor.
¿Hay alguna posibilidad de que funcione sin crear primero una instancia y sin los corchetes vacíos? Solo (x => x.Prop1) – user137348
Se agregó una sobrecarga para ese caso (sin embargo, el código es el mismo, y la idea ya está expresada en la respuesta de Darin). – max
hay un pequeño problema, tengo que especificar el tipo de propiedad (int, string ..) ¿Se puede manejar esto? – user137348