我希望能清楚、简洁地解释这一点。我有个说法:
Expression<Func<TObject, TProperty>> expression我正试着从他那得到财产的名字。在GetPropertyName方法中--这是我想要对问题进行排序的地方--遇到了一个转换表达式,这一切都很好,而且很好,比如,正常的属性可能以{e =>e.EmployeeID}的形式出现,但是在一些情况下,我得到了{e => Convert(e.EmployeeID)}的结果。实际上,这意味着我无法识别正确的属性名(我不想解析异常,如‘t()等)。
如何将表达式名称清晰地提取为属性。下面是我正在使用的代码,所以可以随意修改它:
public static class ExpressionExtensions
{
public static string GetPropertyName<TObject, TProperty>(
this Expression<Func<TObject, TProperty>> expression) where TObject : class
{
if (expression.Body.NodeType == ExpressionType.Call)
{
MethodCallExpression methodCallExpression = (MethodCallExpression)expression.Body;
string name = ExpressionExtensions.GetPropertyName(methodCallExpression);
return name.Substring(expression.Parameters[0].Name.Length + 1);
}
return expression.Body.ToString().Substring(expression.Parameters[0].Name.Length + 1);
}
private static string GetPropertyName(MethodCallExpression expression)
{
MethodCallExpression methodCallExpression = expression.Object as MethodCallExpression;
if (methodCallExpression != null)
{
return GetPropertyName(methodCallExpression);
}
return expression.Object.ToString();
}
}我引用它是这样的:
string propertyName = expression.GetPropertyName();
// which ideally should return a value of EmployeeID or ReportsTo
// as per the usage example below这就产生了一些任意的用法,例如:
var tree = items2.AsHierarchy(e => e.EmployeeID, e => e.ReportsTo);希望这能给我足够的信息让我摆脱圈套!
干杯
发布于 2011-01-07 17:06:41
您应该在表达式树中有一个“转换”节点,所以您应该测试节点的节点类型“转换”,如果是的话,那么在转换到string之前先深入一个级别。试着做这样的事情:
public static string GetMemberName<TSource,TMember>(this Expression<Func<TSource,TMember>> memberReference)
{
MemberExpression expression = memberReference.Body as MemberExpression;
if (expression == null)
{
UnaryExpression convertexp = memberReference.Body as UnaryExpression;
if(convertexp!=null)
expression = convertexp.Operand as MemberExpression; ;
}
if(expression==null)
throw new ArgumentNullException("memberReference");
return expression.Member.Name;
}发布于 2011-01-07 16:40:19
你有一个{e => Convert(e.EmployeeID)}操作的例子吗?
我猜想Convert是一个装箱操作,也就是说它采用了一个值类型(大概是一个int?)并转换为object。如果是这样的话,从int转换到object是正确的做法,Convert是不可避免的;您应该在GetPropertyName方法中绕过它。
https://stackoverflow.com/questions/4627816
复制相似问题