【问题标题】:Building LINQ Expressions Dynamically w/ Unknown Types使用未知类型动态构建 LINQ 表达式
【发布时间】:2010-12-30 21:51:39
【问题描述】:

我想知道是否可以使用这个表达式构建器类来动态生成 lambda 表达式,其中要过滤的类型在编译时是未知的。

我有一个构造表达式的方法,

public static Expression<Func<T, bool>> GetExpression<T>(IList<QueryFilter> filters)

还有一个 QueryFilter 对象,

public class QueryFilter 
{
    public string PropertyName { get; set; }       
    public ExpressionType OpType { get; set; } 
    public object Value { get; set; }
}

您可以在其中生成一个使用传入的 QueryFilters 过滤对象 T 的新表达式。我想开发一种类型未知的方法,即。

public static Expression<Func<T,bool>> GetExpression(IList<QueryFilter> filters, Type type)

因此,我可以将类型作为参数从对 System.Reflection 的调用中传递,而不必在代码中指定它。例如类似的事情,

    public static Expression NewExpression(IList<QueryFilter> filters, Type T)
    {
        return GetExpression<Type>(filters); 
    }

如果可以在 Type 替换通用 'T' 的情况下使用这种语法?由于我不认为我可以在 括号内指定运行时动态类型,还有另一种方法,也许使用

Func<object,bool> 

改为?

【问题讨论】:

    标签: c# linq expression-trees


    【解决方案1】:

    尝试使用 DynamicExpression.ParseLambda

    【讨论】:

    • 这应该可以,谢谢。但是我注意到的一个问题是,当您指定二进制 lambda 表达式的字符串表示形式时,例如“TimeOfAction > @0”,构建表达式的 .ToString() 表示表示“GreaterThan”或“LessThan”,而不是适当的象征。那么如何动态设置二元运算呢?
    • 对不起,我不知道,也许你应该再问一个问题
    【解决方案2】:

    【讨论】:

    • 我注意到 Dynamic Linq 库和 Linq.Expressions 命名空间都有一个具有不同成员的 DynamicExpression 类,因此 IDE 会引发有关冲突的投诉。你通常如何解决这个问题?
    • @sean:查看 MSDN 文档,DynamicExpression 类似乎已合并到 .NET Framework 4.0 中,并带有一些“增强功能”。因此,Dynamic Linq 库只能在 .NET 3.5 下未经修改地工作
    猜你喜欢
    • 2014-07-06
    • 1970-01-01
    • 2015-12-01
    • 2015-04-22
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    相关资源
    最近更新 更多