【问题标题】:Convert Expression<Func<TModel, IList<TItem>>> to Expression<Func<TModel, IEnumerable>>将 Expression<Func<TModel, IList<TItem>>> 转换为 Expression<Func<TModel, IEnumerable>>
【发布时间】:2012-05-25 10:21:34
【问题描述】:

我有办法:

public void Foo(Expression<Func<TModel, IEnumerable>> expression) {
  // foo
}

我有变量:

Expression<Func<TModel, IList<TItem>>> expression;

如何将我的变量传递给Foo

【问题讨论】:

  • 付出了很多的努力。请参阅我自己的问题here;至少阅读my answer(因为被接受的没有回答您问题中最重要的部分) cmets。我不会将其标记为欺骗,让您决定。

标签: c# .net generics expression enumerable


【解决方案1】:

你必须转换你的表达式变量:

var exp = Expression.Lambda<Func<TModel, IEnumerable>>(expression.Body, expression.Parameters);
Foo(exp);

【讨论】:

  • 在转换为 Expression> 时会出现 InvalidCastException。不强制将 LambdaExpression 传递给 Foo 将导致编译器错误。
  • @Dennis 我的解决方案不使用强制转换,因此可以正常工作。
  • 我的错。我错过了使用泛型重载Expression.Lambda
【解决方案2】:

使用这个:

    public Expression<Func<TModel, IEnumerable>> ConvertExpression<TModel, TItem>(Expression<Func<TModel, IList<TItem>>> expression)
    {
        return (Expression<Func<TModel, IEnumerable>>)Expression
            .Lambda(Expression.Convert(expression.Body, typeof(IEnumerable)), expression.Parameters);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    相关资源
    最近更新 更多