gpt4 book ai didi

c# - 是否可以调用参数为 'lambda expression' 的方法?

转载 作者:太空宇宙 更新时间:2023-11-03 20:57:14 25 4
gpt4 key购买 nike

假设我有一个具有以下签名的方法:

public string Foo(Expression expression)
{
...
}

是否可以直接调用此方法,而不使用代理方法,如果可以,如何调用?

作为一个额外的问题(为了理解我为什么要这样做),是否可以声明一个在所有这些情况下都会被调用的方法(没有重载):

Foo(P p => "");
Foo((P p, Q q) => "");
Foo((P p, Q q, R r) => "");

我试图用单一方法编写它的原因是因为我只对 lambda 表达式参数感兴趣以某种方式解析它,而不是执行它。

最佳答案

要直接调用此方法,您需要将传递的表达式转换为特定的表达式委托(delegate)类型。例如:

Foo((Expression<Func<P, string>>) ((P p) => ""));
Foo((Expression<Func<P, Q, string>>) ((P p, Q q) => ""));
Foo((Expression<Func<P, Q, R, string>>) ((P p, Q q, R r) => ""));
Expression<Func<P, string>> x = (P p) => "";
Foo(x); // also fine

原因是否则编译器无法推断要使用的委托(delegate)类型。表达式 (P p) => ""本身没有类型,类型由上下文决定。如果您在需要委托(delegate)的上下文中使用它,并且它是兼容的——它将是一个委托(delegate):

Func<P, string> x = (P p) => "";
MyDelegate x = (P p) => "";

如果您在需要特定委托(delegate)类型的表达式树的上下文中使用它 - 它将是表达式树:

Expression<Func<P, string>> x = (P p) => "";

但在您的情况下 - 无法推断其类型。可以是Expression<Func<P, string>> , Expression<MyCustomDelegate>或其他任何东西。不同的委托(delegate)类型并不相同,即使它们具有相同的签名。所以你必须明确地告诉它。

关于c# - 是否可以调用参数为 'lambda expression' 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49213024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com