获取强类型的子属性名称

使用控件和网格的数据绑定对象,我讨厌属性名称将如何成为魔术字符串,因此我创建了一个非常简单的方法,如下所示:

public static string GetPropertyName(Expression<Func> expressionForProperty) { MemberExpression expression = expressionForProperty.Body as MemberExpression; return expression.Member.Name; } 

这让我可以使用如下代码:

 Product.GetPropertyName(m => m.Name) 

返回“名称”。

这适用于基本对象。 但是,如果我将方法调用更改为:

 Product.GetPropertyName(m => m.ProductCategory.Name) 

这也返回“名称”。 但为了使数据绑定工作,我需要它返回“ProductCategory.Name”。 有没有办法通过改变方法“GetPropertyName”来达到这个目的?

可能的解决方法是:

 string test = Product.GetPropertyName(p => p.ProductCategory) + "." + ProductCategory.GetPropertyName(pc => pc.Name) 

但是,这不是一个简洁的解决方案。

这是我在StackOVerflow上找到的一些修改版本:

 public static class GetPropertyNameExtension { public static string GetPropertyName(this Expression> propertyExpression) { return propertyExpression.Body.GetMemberExpression().GetPropertyName(); } public static string GetPropertyName(this Expression> propertyExpression) { return propertyExpression.Body.GetMemberExpression().GetPropertyName(); } public static string GetPropertyName(this MemberExpression memberExpression) { if (memberExpression == null) { return null; } if (memberExpression.Member.MemberType != MemberTypes.Property) { return null; } var child = memberExpression.Member.Name; var parent = GetPropertyName(memberExpression.Expression.GetMemberExpression()); return parent == null ? child : parent + "." + child; } public static MemberExpression GetMemberExpression(this Expression expression) { if (expression is MemberExpression) return (MemberExpression)expression; if (expression is UnaryExpression) return (MemberExpression)((UnaryExpression)expression).Operand; return null; } } 

我提出以下似乎有效:

 public static string GetComplexPropertyName(Expression> expressionForProperty) { // get the expression body Expression expressionBody = expressionForProperty.Body as MemberExpression; string expressionAsString = null; // all properties bar the root property will be "convert" switch (expressionBody.NodeType) { case ExpressionType.Convert: case ExpressionType.ConvertChecked: UnaryExpression unaryExpression = expressionBody as UnaryExpression; if (unaryExpression != null) { expressionAsString = unaryExpression.Operand.ToString(); } break; default: expressionAsString = expressionBody.ToString(); break; } // makes ure we have got an expression if (!String.IsNullOrWhiteSpace(expressionAsString)) { // we want to get rid of the first operand as it will be the root type, so get the first occurence of "." int positionOfFirstDot = expressionAsString.IndexOf('.'); if (positionOfFirstDot != -1) { return expressionAsString.Substring(positionOfFirstDot + 1, expressionAsString.Length - 1 - positionOfFirstDot); } } return string.Empty; }