我希望能够清楚简明地解释这一点.我有一个表达方式:
Expression<Func<TObject, TProperty>> expression
Run Code Online (Sandbox Code Playgroud)
我正试图从中获取属性名称.一切都很好和花花公子'UNTIL',遇到一个转换表达式(在GetPropertyName方法 - 这是我想要排序问题的地方),即正常的属性可能会出来,{e =>e.EmployeeID}但在少数情况下,我得到的结果{e => Convert(e.EmployeeID)}.这实际上意味着我无法识别正确的属性名称(我不想解析诸如Convert()等的异常).
如何将表达式名称干净地提取为属性.下面是我正在使用的代码,所以请随意篡改:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
而我正如此调用它:
string propertyName = expression.GetPropertyName();
// which ideally should return a value of EmployeeID or ReportsTo
// as per the usage example below
Run Code Online (Sandbox Code Playgroud)
这会影响一些仲裁用法,例如:
var tree = items2.AsHierarchy(e => e.EmployeeID, e => e.ReportsTo);
Run Code Online (Sandbox Code Playgroud)
希望这能提供足够的信息让我脱离套索!!
干杯
小智 5
您应该在表达式树中有一个"转换"节点,因此您应该测试nodetype为"convert"的节点,然后如果为true,则在转换为字符串之前更深一级.尝试这样的事情:
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;
}
Run Code Online (Sandbox Code Playgroud)