获取.NET 3.5中的Lambda表达式中使用的属性名称

我有一个问题一直唠叨我一段时间,我找不到答案。

我需要获取Lambda表达式中引用的属性的名称。 我会将lambda表达式提供给一个返回字符串的方法。 例如,如果我有:

x => x.WeirdPropertyName 

然后该方法将返回:

 "WeirdPropertyName" 

我已经读过它可以用表达式树来完成,但答案已经没有了。

谢谢你的帮助

干得好:

 string GetPropertyName(Expression> property) { var propertyInfo = (property.Body as MemberExpression).Member as PropertyInfo; if (propertyInfo == null) { throw new ArgumentException("The lambda expression 'property' should point to a valid Property"); } return propertyInfo.Name; } 

我在这里得到了一个非常全面的答案。

除了处理像x => x.WeirdPropertyName这样的表达式x => x.WeirdPropertyName ,它还可以处理“扩展”表达式,例如x => x.WeirdMember.WeirdPropertyName

这是答案的代码:

 // code adjusted to prevent horizontal overflow static string GetFullPropertyName (Expression> exp) { MemberExpression memberExp; if (!TryFindMemberExpression(exp.Body, out memberExp)) return string.Empty; var memberNames = new Stack(); do { memberNames.Push(memberExp.Member.Name); } while (TryFindMemberExpression(memberExp.Expression, out memberExp)); return string.Join(".", memberNames.ToArray()); } // code adjusted to prevent horizontal overflow private static bool TryFindMemberExpression (Expression exp, out MemberExpression memberExp) { memberExp = exp as MemberExpression; if (memberExp != null) { // heyo! that was easy enough return true; } // if the compiler created an automatic conversion, // it'll look something like... // obj => Convert(obj.Property) [eg, int -> object] // OR: // obj => ConvertChecked(obj.Property) [eg, int -> long] // ...which are the cases checked in IsConversion if (IsConversion(exp) && exp is UnaryExpression) { memberExp = ((UnaryExpression)exp).Operand as MemberExpression; if (memberExp != null) { return true; } } return false; } private static bool IsConversion(Expression exp) { return ( exp.NodeType == ExpressionType.Convert || exp.NodeType == ExpressionType.ConvertChecked ); } 

我知道获取属性的字符串名称的唯一方法是通过reflection。