C# - 传递委托一个参数并将其解压缩

时间:2013-05-12 09:09:03

标签: c# delegates extraction

我有以下授权情况:

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之前制作一些逻辑,然后在逻辑之后执行方法.Invoke。

有可能吗? 我在这里错过了什么吗? 感谢

5 个答案:

答案 0 :(得分:2)

让我们打破这一点。

您的Func Func<string, T>方法需要一个接受string参数并返回T的函数。

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

“这是一个带有x参数的函数,它通过调用MethodToInvoke(myVal)实现,返回类型是MethodToInvoke()返回的任何类型。”

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

要解决此问题,请使用x之类的内容(并添加myVal作为额外参数):

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

可以简化为:

Step(MethodToInvoke, myVal);

然后,您需要更改Step()方法以获取其他字符串参数,并将其传递给也传递给Step()的Func:

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);
}

答案 1 :(得分:1)

这足以提供所需的输出:

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";
}

答案 2 :(得分:0)

尚未将字符串发送到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");

答案 3 :(得分:0)

我认为您想要的是以下内容:

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。

答案 4 :(得分:0)

您指定的lambda表达式,只是访问myVal。如果要将带参数的委托传递给方法,请执行以下操作:

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