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
之前做一些逻辑,在逻辑之后做方法。
有可能吗?我遗漏了什么吗?由于
我们来分析一下。
你的函数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);
}