2016-07-15 6 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方法に2つ目の引数を渡す:

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

あなたが常に必要に応じてidが同様に、オプションの入力を持たせることができます。

int id= 10 
+0

oh right!愚かな私、私はRunMethod(_memberRepo.Get(id))と戦ってきた – Jamie

2

あなたが実行するラムダ関数を渡すことができますあなたが望むどんな行動:

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

これは01

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

この:

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

更新必要であれば、あなたのRunMethod()署名を変更する機能を持っている場合、あなたはこれを行うことができますので、かなり無意味なメソッドシグネチャの一部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); 
+0

私はこの構文 '_'を認識しません、これはどういう意味ですか? – Jamie

+0

これは単なるパラメータ名です。これを 'parameterImNotGoingToUse'やその他の有効なC#識別子に変更することができます。 – JLRishe

関連する問題