2016-07-15 157 views
0

以前我发布过类似的问题(和答案),但是我意识到在将方法传递给另一个方法时仍然缺少一部分难题。我的问题是当一个方法作为参数传递时,如何包含参数?我在下面包含了一个例子。将方法作为参数传递给另一个方法,但参数为

任何帮助非常感谢。

非常感谢,

服务电话

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

回答

2

只是传递第二个参数RunMethod方法:

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

您可以随时在id有一个可选的输入,以及如果需要的话:

int id= 10 
+0

哦对!傻我,我一直与RunMethod战斗(_memberRepo.Get(id)) – Jamie

2

您可以通过执行lambda函数无论你想要采取什么行动:

var result = RunMethod(_ => _memberRepo.Get(10)); 

这使得01方法签名的部分毫无意义的,所以如果你必须改变你的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); 
    .. 
} 

and

var result = RunMethod(memberRepo.Get, 10); 
+0

我不认识这种语法'_',这是什么意思? – Jamie

+0

这只是一个参数名称。您可以将其更改为'parameterImNotGoingToUse'或任何其他有效的C#标识符。 – JLRishe

相关问题