我之前发过一个类似的问题(并回答过),但我发现在将方法传递给另一种方法时,我仍然缺少一个难题。我的问题是,当一个方法作为参数传递时,如何包含参数?我在下面列举了一个例子。
任何帮助都非常感激。
非常感谢,
服务电话
private readonly MemberRepo _memberRepo;
public SomeService()
{
_memberRepo = new MemberRepo();
}
public string GetMembers(int id)
{
// This works, i.e. the RunMethod internally calls the Get method on the repo class - problem: how can I pass the id into the repo Get method?
var result = RunMethod(_memberRepo.Get);
...
return stuff;
}
private string RunMethod(Func<int, string> methodToRun)
{
var id = 10; // this is a hack - how can I pass this in?
var result = methodToRun(id);
..
}
存储库
public class MemberRepo
{
public string Get(int id)
{
return "Member from repository";
}
}
更新
private string RunMethod(Func<int, string> methodToRun)
{
if(id.Equals(1))
{
// Do something
//
var result = methodToRun(id);
..
}
答案 0 :(得分:2)
只需将第二个参数传递给RunMethod
方法:
private string RunMethod(Func<int, string> methodToRun, int id)
{
var result = methodToRun(id);
..
}
如果需要,您始终可以让id
有可选输入:
int id= 10
答案 1 :(得分:2)
您可以传递lambda函数,该函数执行您想要的任何操作:
var result = RunMethod(_ => _memberRepo.Get(10));
这使得方法签名的int
部分毫无意义,因此如果您能够更改RunMethod()
签名,则可以执行此操作:
private string RunMethod(Func<string> methodToRun)
{
var result = methodToRun();
..
}
然后这个:
var result = RunMethod(() => _memberRepo.Get(10));
更新如果您需要能够访问RunMethod()
方法中的参数,那么只需将其作为单独的参数传递,如TheLethalCoder建议的那样:
private string RunMethod(Func<int, string> methodToRun, int id)
{
if(id.Equals(1))
{
// Do something
//
var result = methodToRun(id);
..
}
和
var result = RunMethod(memberRepo.Get, 10);