Obter o nome e o tipo da propriedade usando a expressão lambda

Eu estou tentando escrever uma function que irá puxar o nome de uma propriedade e o tipo usando a syntax como abaixo:

private class SomeClass { Public string Col1; } PropertyMapper propertyMapper = new PropertyMapper(); propertyMapper.MapProperty(x => x.Col1) 

Existe alguma maneira de passar a propriedade através da function sem grandes alterações para esta syntax?

Eu gostaria de obter o nome da propriedade e o tipo de propriedade.

Então, no exemplo abaixo, eu gostaria de recuperar

Name = "Col1" e Type = "System.String"

Alguém pode ajudar?

Aqui está um exemplo de como usar expressões para obter o nome de uma propriedade ou campo para você começar:

 public static MemberInfo GetMemberInfo(Expression> expression) { var member = expression.Body as MemberExpression; if (member != null) return member.Member; throw new ArgumentException("Expression is not a member access", "expression"); } 

Código de chamada ficaria assim:

 public class Program { public string Name { get { return "My Program"; } } static void Main() { MemberInfo member = ReflectionUtility.GetMemberInfo((Program p) => p.Name); Console.WriteLine(member.Name); } } 

Uma palavra de caucanvas, no entanto: a simples afirmação de (Program p) => p.Name realmente envolve um pouco de trabalho (e pode levar quantidades mensuráveis ​​de tempo). Considere o armazenamento em cache do resultado em vez de chamar o método com frequência.

Eu achei isso muito útil.

 public class PropertyMapper { public virtual PropertyInfo PropertyInfo(Expression> expression) { var member = expression.Body as MemberExpression; if (member != null && member.Member is PropertyInfo) return member.Member as PropertyInfo; throw new ArgumentException("Expression is not a Property", "expression"); } public virtual string PropertyName(Expression> expression) { return PropertyInfo(expression).Name; } public virtual Type PropertyType(Expression> expression) { return PropertyInfo(expression).PropertyType; } } 

Eu fiz essa pequena aula para seguir o pedido original. Se você precisar do nome da propriedade, você pode usá-lo assim:

 PropertyMapper propertyMapper = new PropertyMapper(); string name = propertyMapper.PropertyName(x => x.Col1); 

Isso pode ser feito facilmente no C # 6. Para obter o nome da propriedade, use nameof operator.

 nameof(User.UserId) 

e para obter o tipo de propriedade use typeof operator.

 typeof(User.UserId) 

Eu só pensei em colocar isso aqui para construir a abordagem anterior.

 public static class Helpers { public static string PropertyName(Expression> expression) { var member = expression.Body as MemberExpression; if (member != null && member.Member is PropertyInfo) return member.Member.Name; throw new ArgumentException("Expression is not a Property", "expression"); } } 

Você pode então chamá-lo da seguinte maneira:

 Helpers.PropertyName(() => TestModel.TestProperty); 

Também devo salientar que, com o VS 2015 e C # 6.0, você pode simplesmente usar o nameof.

https://msdn.microsoft.com/pt-br/library/dn986596.aspx