See here. The idea is to use Expression Trees.
public static string GetPropertyName<T, TReturn>(Expression<Func<T, TReturn>> expression)
{
MemberExpression body = (MemberExpression)expression.Body;
return body.Member.Name;
}
And then use it like:
var name = GetPropertyName<MyClass, string>(c => c.FirstName);
A bit cleaner solution would be if one would not required to specify so much generic parameters. And it is possible via moving MyClass
generic param to util class:
public static class TypeMember<T>
{
public static string GetPropertyName<TReturn>(Expression<Func<T, TReturn>> expression)
{
MemberExpression body = (MemberExpression)expression.Body;
return body.Member.Name;
}
}
Then usage will be cleaner:
var name = TypeMember<MyClass>.GetPropertyName(c => c.FirstName);