2012-01-11 13 views
1

値リストが既にリストに格納されていて、その関数が毎回同じではない関数に値リストを渡すにはどうすればよいですか?リストメンバーを関数に渡す

説明するには、いくつかの異なるタイプのカスタムオブジェクト(この作業を行うにはList<object>)のリストがあり、それらのオブジェクトを関数に渡したいと思います。しかし、その機能は必ずしも同じではありません。私はいくつかの異なる関数を持つことができ、Listの内容は常に関数の入力変数と一致すると仮定して、リストの内容を関数に渡すことができます。私は私のリストは、常にうまくいくこと、右の位置に変数の適切な量が含まれています知っているので、今

List<object> myListOfVariables = new List<object>(); 
myListOfVariables.Add("Hello, world!"); 
myListOfVariables.Add(10); 

void SayHelloXTimes(string helloString, int x) { 
    for(int i = 0;i<x;i++) { 
     print(helloString) 
    } 
} 

SayHelloXTimes(myListOfVariables[0], myListOfVariables[1]); 

次のコードは動作するかもしれないものの一例ですが、1つの欠陥のために私はただ一つの機能しか持っていなかった。しかし、問題は、私はこれを展開する必要があるので、私のリストを分解し、それを異なる量のパラメータで関数に渡すことができるということです。

その他の理由から、私のリストには常に適切な量の変数が適切な位置にあることがわかっているので、それについて心配する必要はありません。値を渡すために必要な関数の名前も知っています。

if (myListOfVariables.Length == 2) { 
    SayHelloXTimes(myListOfVariables[0], myListOfVariables[1]); 
} 

else if (myListOfVariables.Length == 3) { 
    SayHelloXTimesForY(myListOfVariables[0], myListOfVariables[1], myListOfVariables[2]); 
} 

しかし、これは(明らかに)本当に不格好コードであると私はすべてのコストでそれを避けるしたい:私はこのように、私は私のリストの長さに応じて、if文の負荷を行う可能性があるとします。私の問題には別の解決策がありますか?私はこれが本当に混乱していることを知っているが、私はそれを説明するために最善を尽くした。私がしようとしていることについてまだ混乱している場合は、私に知らせてください。

いいえ、これは宿題の問題ではありません。 ;)

+0

リスト自体を渡すのはなぜですか? – BrokenGlass

+0

私はそれをハートビートでやっただろうが、説明するのにもう5つから10つのパラグラフが必要な理由ではできない。 :)短い話をすると、私は(何かのための)非常に基本的なAPIを作成しようとしており、潜在的なユーザーが関数のパラメータとしてオブジェクトのリストを使用することを制限したくありません。 –

+0

私はそれが何であるか分からないので、私は今は何もしないと思います。私はIEnumerablesを見なければならないでしょう。 –

答えて

1

私はあなたがしたいと思うが反射を使用して行うことができますしたいと思います。 Look at MethodBase.Invoke Method

あなたがしなければならないことは、関数がオブジェクト配列に期待する順序ですべてのパラメータを追加することだけです。

class Program 
    { 

     public static void SayHelloXTimes(string helloString, int x) 
     { 
      for (int i = 0; i < x; i++) 
      { 
       Console.WriteLine(helloString); 
      } 
     } 

     static void Main(string[] args) 
     { 
      MethodInfo Method = typeof(Program).GetMethod("SayHelloXTimes"); 
      Method.Invoke(null, new object[] { "foo", 3 }); 

      Console.ReadLine(); 
     } 
    } 
+0

それは有望に見える、私はそれをチェックし、それが私の状況に適しているかどうかを確認する必要があります。ありがとう! –

+0

C#のサンプルコードでどのように 'var'を使用していますか?直後の 'typeof'文は何か関係がありますか? –

+0

@ElliotBonneville varはMethodInfoです。私の答えを編集しました –

0

あなたはparamsをしたい:

void SayHelloXTimes(params string[] list) { 
    for(int i = 0;i<list.Length;i++) { 
     print(list[i]) 
    } 
} 



SayHelloXTimes("Hi", "Hi", "Hi"); // legal 
SayHelloXTimes("Hi"); // legal 
SayHelloXTimes("Hi", "Hi", "Hi", "Hi", "Hi", "Hi"); // still legal 
+0

元の質問に私のコメントを参照してください、または私が何かを誤解した場合は私を修正してください。 :) –

+0

関数の違いがパラメータの数だけである場合、paramsという単語を使用するのが最適な解決方法です。 – Kath

+0

paramsキーワードを使用すると、必要な多くの文字列で関数を呼び出すことができます。 – Joe

0

これは私のアプリケーションであれば、私はリストの値を保持するために、パラメータのクラスを作成します。

リストをクラスのコンストラクタに渡し、クラスのローカルプロパティ(位置を知っているため)に抽出するか、値を読み取り専用プロパティとしてリストから直接公開することができます。

これで、パラメータクラスのインスタンスを各メソッドに渡すことができ、メソッドのパラメータ数を気にする必要がなくなります。