【问题标题】:Get propertyinfo from lambda expression, but fails with int从 lambda 表达式获取 propertyinfo,但因 int 失败
【发布时间】:2017-03-22 14:23:25
【问题描述】:

在 lambda 表达式中获取项目的所有 PropertyInfo 的最佳方法是什么。

我想在 sql 数据库中的 xml 字段上设置过滤器。

var FilterBase = new FilterBase<SimpleItemSubObject>()
                    .SetSimpleFilter(x => x.ID, 123)
                    .SetSimpleFilter(x => x.Test.Name, "demo3");

在分析仪中,我可以获取 Name 属性的属性信息。

internal IEnumerable<PropertyInfo> GetExpressionList()
{
    return GetPropertyListfor(lambda.Body as MemberExpression);
}

private IEnumerable<PropertyInfo> GetPropertyListfor(MemberExpression body)
{
    var result = new List<PropertyInfo>();
    if (body != null && body.Expression != null)
    {
        result.AddRange(GetPropertyListfor(body.Expression as MemberExpression));
        result.Add((body as MemberExpression).Member as PropertyInfo);
    }

    return result;
}

如果它是一个字符串属性,这将返回属性信息。但是在 int 的情况下,分析器会失败,因为 lambda 添加了转换函数。

{x => Convert(x.ID)}

它增加了一个转换功能。

那么在这种情况下,对于 x.ID,获取 propertyinfo 的最佳方法是什么。以及如何防止使用转换功能

【问题讨论】:

    标签: c# reflection lambda expression-trees


    【解决方案1】:

    编译器添加Convert 表达式的事实表明您正在使用具有object 返回类型的非泛型lambda 表达式。像这样的:

    public class FilterBase<T>
    {
        public FilterBase<T> SetSimpleFilter(Expression<Func<T, object>> selector, object value)
        {
            // ...
            return this;
        }
    }
    

    解决问题的一种方法是使方法通用(类似于 LINQ OrderBy):

    public FilterBase<T> SetSimpleFilter<V>(Expression<Func<T, V>> selector, V value)
    

    所以不会再有Convert了。

    另一种方法是保持方法不变,并删除第一个Convert(如果有):

    internal IEnumerable<PropertyInfo> GetExpressionList()
    {
        var body = lambda.Body;
        if (body.NodeType == ExpressionType.Convert)
            body = ((UnaryExpression)body).Operand;
        return GetPropertyListfor(body as MemberExpression);
    }
    

    【讨论】:

    • 谢谢。为您解答。正如你所说,我剥夺了皈依者。但是感谢您提供有关添加转换原因的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多