我有以下委派情况:
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之前做一些逻辑,在逻辑之后做method.Invoke。
有可能吗?我是不是漏掉了什么?谢谢
发布于 2013-05-12 17:58:24
这足以提供所需的输出:
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-12 17:28:07
让我们来分析一下。
您的Func 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()方法,以获取额外的字符串参数,并将其传递给函数,该函数也将传递给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);
}发布于 2013-05-12 17:17:34
这些字符串尚未发送到Step方法。它只被发送到Step方法的λ表达式使用,而λ表达式忽略了输入变量,所以如果您在调用字符串之前对它做了任何操作,它也不会有任何帮助,它仍然会使用原始字符串并忽略您发送给它的内容。
首先让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");https://stackoverflow.com/questions/16505805
复制相似问题