如何在 c# 中强制转换表达式

本文关键字:转换 表达式 | 更新日期: 2023-09-27 18:35:11

我有表达式

Expression<Func<TSource, string>> 

我把它投到Expression<Func<TSource, object>>

使用作为

As Expression<Func<TSource, object>>

但是每次都给我空.

由于字符串是引用类型,因此不应这样做。

即使Expression<Func<TSource, MyClass>>此表达式在转换时也给出 null。

如何在 c# 中强制转换表达式

Func<TSource, string>Func<TSource, object>是不同的类型,因此Expression<Func<TSource, string>>Expression<Func<TSource, object>>也是不同的类型。

有一个从Func<TSource, string>Func<TSource, object>的隐式转换,但这个异常还没有扩展到Expression<T>,一般来说,这样的异常扩展是不安全的,即使它在这里可能是安全的。

但是,您可以创建新表达式,并复制旧表达式的正文。

Expression<Func<string>> expr = () => "Hello";
Expression<Func<object>> expr2 =
  Expression.Lambda<Func<object>>(expr.Body, expr.Parameters);

如前所述,您不能通过简单的使用从Expression<Func<TSource, string>>转换为Expression<Func<TSource, object>>

正如@hvd所说,您需要创建一个新表达式并复制旧表达式。 但是,由于该示例显示的签名与问题不同,因此下面是使用 TSource 输入参数的外观。

var newFunc = 
    Expression.Lambda<Func<TSource, object>>(oldFunc.Body, oldFunc.Parameters);

而且,如@aron所示,如果表达式的返回类型未隐式转换为对象,则以下内容是正确的。

var newFunc = 
    Expression.Lambda<Func<TSource, object>>(
        Expression.TypeAs(oldFunc.Body, typeof(object)), oldFunc.Parameters);