将一个方法作为参数传递到另一个方法中,但带有参数

本文关键字:方法 另一个 参数 一个 参数传递 | 更新日期: 2023-09-27 17:57:03

我之前发布过类似的问题(并回答过),但我意识到在将一个方法传递到另一个方法时,我仍然缺少一块拼图。 我的问题是,将方法作为参数传递时,如何包含参数? 我在下面举了一个例子。

任何帮助非常感谢。

非常感谢,

服务呼叫

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

将一个方法作为参数传递到另一个方法中,但带有参数

只需将第二个参数传递给 RunMethod 方法:

private string RunMethod(Func<int, string> methodToRun, int id)
{
    var result = methodToRun(id);
    ..
}

如果需要,您可以随时id具有可选输入:

int id= 10

您可以传递一个 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);