2

我有以下代表团情况:

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做一些逻辑之前和在逻辑之后做方法。调用。

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

4

5 回答 5

2

让我们分解一下。

您的 FuncFunc<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);
}
于 2013-05-12T09:28:06.557 回答
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";
}
于 2013-05-12T09:58:23.693 回答
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");
于 2013-05-12T09:17:34.283 回答
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。

于 2013-05-12T09:17:57.050 回答
0

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

public void foo(Func<string, int> myFunc, string arg)
{
    int result = myFunc(arg);
}
于 2013-05-12T09:19:41.790 回答