c# -向委托传递参数并提取它

本文关键字:参数 提取 | 更新日期: 2023-09-27 18:13:06

我有以下委托情况:

string myVal = "test";
Step(x => MethodToInvoke(myVal));

private T Step<T>(Func<string, T> method){
    str = ;//Where do I get the string myVal from???
    return method.Invoke(str);
}
private string MethodToInvoke(string str){
   return str + "_invoked"
}

我如何在方法Step中获得已发送的参数?( string myVal = "test")我想在method.Invoke之前做一些逻辑,在逻辑之后做方法。

有可能吗?我遗漏了什么吗?由于

c# -向委托传递参数并提取它

我们来分析一下。

你的函数Func<string, T>方法期望一个函数接受一个string参数并返回一个T

当你用x => MethodToInvoke(myVal)初始化Func<string, T>时,你在说:

"这里有一个函数,参数名为x,通过调用MethodToInvoke(myVal)实现,返回类型是MethodToInvoke()返回的类型。"

虽然该函数有一个名为x的参数,但实际上您并没有在=>的右侧使用它,因为您使用的是myVal

要解决这个问题,使用x像这样(并添加myVal作为一个额外的参数):

Step(x => MethodToInvoke(x), myVal);

可以简化为:

Step(MethodToInvoke, myVal);

然后你需要改变你的Step()方法,接受一个额外的字符串参数,并将其传递给Func,也传递给Step():

T Step<T>(Func<string, T> method, string str)
{
    return method.Invoke(str);
}

也可以简化为:

T Step<T>(Func<string, T> method, string str)
{
    return method(str);
}

这足以给出期望的输出:

string myVal = "test";
Step(x => MethodToInvoke(x), myVal);
private T Step<T>(Func<string, T> method, string str)
{
  return method.Invoke(str);
}
private string MethodToInvoke(string str)
{
   return str + "_invoked";
}

该字符串尚未发送给Step方法。它只被发送给Step方法的lambda表达式使用,并且lambda表达式忽略了输入变量,因此如果在调用它之前对字符串做任何操作,它将没有帮助,它仍然使用原始字符串并忽略您发送给它的内容。

首先让lambda表达式使用输入参数而不是变量,然后将字符串发送到Step方法:

Step(x => MethodToInvoke(x), "test");
private T Step<T>(Func<string, T> method, string value){
  str = value; // do whatever you like with the string
  return method(str);
}

好吧,因为MethodToInvoke方法已经使用了输入参数,所以您根本不需要lambda表达式,您可以从方法中创建一个委托:

Step(MethodToInvoke, "test");

我认为你需要的是:

string myVal = "test";
Step(myVal, x => methodToInvoke(x));
private T Step<T>(string myVal, Func<string, T> method){
    str = myVal;//Where do I get the string myVal from???
    return method.Invoke(str);
}
private string MethodToInvoke(string str){
   return str + "_invoked"
}

您需要将myVal变量传递给Step方法,然后在StepMethod中将其传递给Func。

您指定的lambda表达式仅访问myVal。如果你想传递一个带有参数的委托给一个方法,可以这样做:

public void foo(Func<string, int> myFunc, string arg)
{
    int result = myFunc(arg);
}