首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Expression<Func>问题

Expression<Func>问题
EN

Stack Overflow用户
提问于 2011-01-07 16:34:49
回答 2查看 348关注 0票数 2

我希望能清楚、简洁地解释这一点。我有个说法:

代码语言:javascript
复制
Expression<Func<TObject, TProperty>> expression

我正试着从他那得到财产的名字。在GetPropertyName方法中--这是我想要对问题进行排序的地方--遇到了一个转换表达式,这一切都很好,而且很好,比如,正常的属性可能以{e =>e.EmployeeID}的形式出现,但是在一些情况下,我得到了{e => Convert(e.EmployeeID)}的结果。实际上,这意味着我无法识别正确的属性名(我不想解析异常,如‘t()等)。

如何将表达式名称清晰地提取为属性。下面是我正在使用的代码,所以可以随意修改它:

代码语言:javascript
复制
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();
    }
}

我引用它是这样的:

代码语言:javascript
复制
string propertyName = expression.GetPropertyName();
// which ideally should return a value of EmployeeID or ReportsTo
// as per the usage example below

这就产生了一些任意的用法,例如:

代码语言:javascript
复制
var tree = items2.AsHierarchy(e => e.EmployeeID, e => e.ReportsTo);

希望这能给我足够的信息让我摆脱圈套!

干杯

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-07 17:06:41

您应该在表达式树中有一个“转换”节点,所以您应该测试节点的节点类型“转换”,如果是的话,那么在转换到string之前先深入一个级别。试着做这样的事情:

代码语言:javascript
复制
        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;
    }
票数 5
EN

Stack Overflow用户

发布于 2011-01-07 16:40:19

你有一个{e => Convert(e.EmployeeID)}操作的例子吗?

我猜想Convert是一个装箱操作,也就是说它采用了一个值类型(大概是一个int?)并转换为object。如果是这样的话,从int转换到object是正确的做法,Convert是不可避免的;您应该在GetPropertyName方法中绕过它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4627816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档