将属性访问器表达式转换为另一个返回更基本类型的表达式的最简单方法

本文关键字:表达式 类型 方法 最简单 另一个 访问 属性 转换 返回 | 更新日期: 2023-09-27 18:19:47

我有一个看起来像的方法

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 => x.Property),那么实现ChangeSelectorReturnType最简单的代码是什么?

我知道在另一个问题中提出的解决方案是有效的,但它需要一个完整的表达访问者,因为没有做出任何假设。我同意这种情况下的假设。

将属性访问器表达式转换为另一个返回更基本类型的表达式的最简单方法

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

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