获取强类型的子属性名称
使用控件和网格的数据绑定对象,我讨厌属性名称将如何成为魔术字符串,因此我创建了一个非常简单的方法,如下所示:
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; } }
我提出以下似乎有效:
上述就是C#学习教程:获取强类型的子属性名称分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
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; }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1033741.html