Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以调用参数为';lambda表达式';?_C#_Lambda_Expression - Fatal编程技术网

C# 是否可以调用参数为';lambda表达式';?

C# 是否可以调用参数为';lambda表达式';?,c#,lambda,expression,C#,Lambda,Expression,假设我有一个具有以下签名的方法: public string Foo(Expression expression) { ... } 是否可以直接调用此方法而不使用代理方法?如果可以,如何调用 作为一个额外的问题(为了理解我为什么要这么做),是否可以声明一个在所有这些情况下都将被调用的方法(没有重载): Foo(P p => ""); Foo((P p, Q q) => ""); Foo((P p, Q q, R r) => ""); 我之所以尝试在一个方法中编写它,

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

public string Foo(Expression expression)
{
    ...
}
是否可以直接调用此方法而不使用代理方法?如果可以,如何调用

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

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

我之所以尝试在一个方法中编写它,是因为我只对lambda expression参数感兴趣,以某种方式解析它,而不是执行它。

是的,您可以使用如下方法

Foo(Expression<Func<TEntity, bool>> query)
{
      // implementation
}
在上述方法调用中不需要使用重载。改为使用此方法并传递所需的lambda


希望对您有所帮助:)

是的,您可以按如下方式使用:

Foo(Expression<Func<TEntity, bool>> query)
{
      // implementation
}
在上述方法调用中不需要使用重载。改为使用此方法并传递所需的lambda


希望有帮助:)

参数
关键字声明一个
委托

例如:

public delegate void ParamsAction(params object[] args);
然后:

使用:

ParamsAction action = Foo;
action(p);
action(p, q);
action(p, q, r);
或:


params
关键字声明一个
delegate

例如:

public delegate void ParamsAction(params object[] args);
然后:

使用:

ParamsAction action = Foo;
action(p);
action(p, q);
action(p, q, r);
或:


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

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
如果在需要特定委托类型的表达式树的上下文中使用它,则它将是表达式树:

Expression<Func<P, string>> x = (P p) => "";
表达式x=(P)=>“”;
但在您的情况下,无法推断其类型。它可以是
Expression
Expression
或任何其他内容。不同的委托类型并不相同,即使它们具有相同的签名。所以您必须明确地告诉它。

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

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
如果在需要特定委托类型的表达式树的上下文中使用它,则它将是表达式树:

Expression<Func<P, string>> x = (P p) => "";
表达式x=(P)=>“”;
但在您的情况下,无法推断其类型。它可以是
Expression
Expression
或任何其他内容。不同的委托类型并不相同,即使它们具有相同的签名。所以你必须明确地告诉它。

但这是一个只有一个输入和一个输出的表达式。我看不出这与OP有两个或三个输入参数的示例如何匹配…您可以使用要传递的参数创建一个实体并将其传递给lambda…但这是一个具有单个输入和单个输出的表达式。我看不出这与OP有两个或三个输入参数的例子如何匹配……你可以用你想要传递的参数创建一个实体,并将其传递给lambda……是否对下一票进行评论?是否对下一票进行评论?这样我就不会有P、Q和R的属性,因为它们都是对象,对吗?那么,变量p、q和r将无法引用类p、q和r的属性?是的,您是对的,您可以在Foo(objects[]args)方法中添加一些逻辑来获取这些属性。问题是Func和Action不能接受可变数量的参数,所以这是一种解决问题的方法,不需要重载Foo方法来接受不同的参数。这样我就不会有P、Q和R的属性,因为它们都是对象,对吗?那么,变量p、q和r将无法引用类p、q和r的属性?是的,您是对的,您可以在Foo(objects[]args)方法中添加一些逻辑来获取这些属性。问题是Func和Action不能接受数量可变的参数,因此这是一种解决问题的方法,它不会重载Foo方法以接受不同的参数。非常感谢!这就解释了。非常感谢!这就解释了。