C# 把一个表情投射到另一个表情上

C# 把一个表情投射到另一个表情上,c#,generics,casting,expression,graphdiff,C#,Generics,Casting,Expression,Graphdiff,我有下面的表达 表达式expr1 有没有办法把它扔给我 表达式 [更新] 或者从现有的表达式创建一个新的表达式?否。第一个是一个函数,它接受一个T并返回一个对象。第二个接受IUpdateConfiguration,并返回对象。除非T也是IUpdateConfiguration,否则不能强制转换此选项。如果您知道将IUpdateConfiguration转换为T的方法,则可以创建新表达式,但这与强制转换不同 例如,鉴于此: Expression<Func<IUpdateConfigur

我有下面的表达

表达式expr1

有没有办法把它扔给我

表达式

[更新]


或者从现有的
表达式
创建一个新的
表达式

否。第一个是一个函数,它接受一个
T
并返回一个
对象
。第二个接受
IUpdateConfiguration
,并返回
对象
。除非
T
也是
IUpdateConfiguration
,否则不能强制转换此选项。如果您知道将
IUpdateConfiguration
转换为
T
的方法,则可以创建新表达式,但这与强制转换不同

例如,鉴于此:

Expression<Func<IUpdateConfiguration<T>, T> expr2;
表达式expr1(expr2(t));

但这将有一个与原始表达式完全不同的表达式体。这可能是问题,也可能不是问题,这取决于您试图完成的任务。

函数的确切定义是什么?@Unihedron:通过它的声明。更具体地说,它是该函数类型的表达式。表达式用于对抽象语法树进行反射,并检查表达式的实际内容。但是输入和输出类型是在泛型参数中指定的
T
object
分别。你能用一个例子来解释你的上一个解决方案(创建新表达式)吗?@Masoud:我提供了一个生成新表达式的例子,并更正了我之前的一个拼写错误。谢谢,但我认为你的例子有一些问题(第二段代码)什么是expr?我有一个
表达式expr1
并希望创建一个新的
表达式
Expression<Func<IUpdateConfiguration<T>, object>> = 
    (IUpdateConfiguration<T> t) => expr1(expr2(t));