【问题标题】:Casting an expression to another one将表达式转换为另一个表达式
【发布时间】:2014-07-06 06:32:17
【问题描述】:

我有以下表达

Expression<Func<T, object>> expr1;

有没有办法把它转换成

Expression<Func<IUpdateConfiguration<T>, object>>?

[更新]

或者从现有的Expression<Func<T, object>> 创建一个新的Expression<Func<IUpdateConfiguration<T>, object>>

【问题讨论】:

    标签: c# generics casting expression graphdiff


    【解决方案1】:

    没有。第一个是接受T 并返回object 的函数。第二个接受IUpdateConfiguration<T> 并返回object。除非T 也是IUpdateConfiguration<T>,否则你不能转换它。如果您知道将IUpdateConfiguration<T> 转换为T 的方法,您可以创建一个new 表达式,但这与强制转换不同。

    例如,给定这个:

    Expression<Func<IUpdateConfiguration<T>, T> expr2;
    

    你可以像这样制作你想要的功能:

    Expression<Func<IUpdateConfiguration<T>, object>> = 
        (IUpdateConfiguration<T> t) => expr1(expr2(t));
    

    但这将有一个与原来完全不同的表达式主体。这可能是也可能不是问题,这取决于您要完成的工作。

    【讨论】:

    • expr1 究竟是一个函数?
    • @Unihedron:根据它的声明。更具体地说,它是该函数类型的表达式。表达式用于对抽象语法树进行反射并检查表达式的实际内容。但是输入和输出类型是在泛型参数中指定的。分别为Tobject
    • 你能用一个例子解释一下你的上一个解决方案(创建新表达式)吗?
    • @Masoud:我提供了一个生成新表达式的示例,并更正了我之前犯的错字。
    • 谢谢,但我认为您的示例有一些问题(第二段代码)什么是 expr?,我有一个 Expression&lt;Func&lt;T, object&gt;&gt; expr1; 并想创建一个新的 Expression&lt;Func&lt;IUpdateConfiguration&lt;T&gt;, object&gt;&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    相关资源
    最近更新 更多