【问题标题】:Simplest way to convert a property accessor expression to another that returns a more base type?将属性访问器表达式转换为另一个返回更多基本类型的最简单方法?
【发布时间】:2012-01-09 18:43:08
【问题描述】:

我的方法看起来像

ISomething<U> Foo<T, U>(Expression<Func<T, U>> selector)
{
    Expression<Func<T, object>> generalSelector =
         ChangeSelectorReturnType<object>(selector);
    Use(generalSelector);
    return new Something<U>(selector);
}

假设selector 始终是一个简单的属性访问器,例如x =&gt; x.Property,那么实现ChangeSelectorReturnType 的最简单代码是什么?

我知道presented in another question 的解决方案有效,但它需要一个完整的表达式访问者,因为没有做出任何假设。在这种情况下,我可以接受假设。

【问题讨论】:

  • 我认为伴随这个问题的代码被过度清理了。 泛型在哪里指定?
  • 哦。它实际上是在一个包含接口上,但为了清楚起见,我会将它添加到方法中。

标签: c# linq lambda expression-trees


【解决方案1】:

在 lambda 的主体上使用 Convert() 表达式。这将允许您更改其类型。然后重新创建 lambda。

var modifiedBody = Expression.Convert(selector.Body, typeof(object));
var generalSelector =
    Expression.Lambda<Func<T, object>>(modifiedBody, selector.Parameters);

【讨论】:

    猜你喜欢
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多