如何在 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。
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);