2017-06-15 6 views
0

私は文字列配列と他のパラメータをオブジェクト配列に渡そうとしています。反対側では、このパラメータ値を取得して表示したいのですが、文字列配列の値を取得できません。文字列配列文字配列の値を取得する方法、つまりオブジェクト配列のパラメータとして渡す方法はありますか?

static void Main(string[] args) 
{ 
    string[] test = {"t1","t2","t3"}; 

    TestArray(1,test,"Hello"); 
} 

static void TestArray(params object[] array) 
{ 
    foreach(var value in array) 
    { 
     Console.WriteLine(value);      
    } 
    Console.ReadLine(); 
} 
+0

なぜ名前付きパラメータを使用するのではなく、このようなパラメータを渡そうとしていますか?あなたが持っている問題は、 'array'の2番目の項目は' string [] '型であり、これに対して' ToString'を呼び出すと(WriteLineが背後で)、その型を出力するだけです。これをやりたくない場合は、コードを変更する必要があります。 – Chris

答えて

1

これを試してみてください:

public static void DisplayParams(params object[] parameters) 
{ 
    foreach(var param in parameters) 
    { 
     var arr = param as string[]; 
     if(arr != null) 
     { 
      foreach(var value in arr) 
      { 
       Console.WriteLine(value); 
      } 
     } 
     else 
     { 
      Console.WriteLine(param); 
     } 
    } 
} 

この部分は:

static void Main(string[] args) 
    { 
     string[] test = { "t1", "t2", "t3" }; 

     TestArray(1, test, "Hello"); 
    } 

    static void TestArray(params object[] array) 
    { 
     foreach (var value in array) 
     { 
      if (value is IEnumerable<object>) 
       foreach (var element in value as IEnumerable<object>) 
        Console.WriteLine(element); 
      else 
       Console.WriteLine(value); 
     } 
     Console.ReadLine(); 
    } 
4

すべての値を文字列で表示しています。 Array.ToString()$elementType[]を返しますので、System.String[]を入力してください。

valueIEnumerableであるかどうかをテストする必要があります。その場合は、それを反復処理してメンバの値を再帰的に出力する必要があります。

static void TestArray(params object[] array) 
{ 
    PrintValue(value);  
} 

public void PrintValue(object value) 
{ 
    var enumerable = value as IEnumerable; 
    if (enumerable != null) 
    { 
     foreach (var subvalue in enumerable) 
     { 
      PrintValue(subvalue); 
     } 
    } 
    else 
    { 
     Console.WriteLine(value.ToString()); 
    } 
} 

複雑なタイプは印刷できません。この場合、タイプ名が再び出力されることに注意してください。

+0

IEnumerable(文字列[])の良い考えになったとは思わなかった! – EpicKip

0

あなたは値がそれ以上の配列とループであるかどうかを確認する必要があり

var arr = p as string[]; 
if(arr != null) 

がいるかどうかをチェックしますが、その配列の場合はそれをループします。もちろん

あなたは、他の種類を挿入したとき、これは動作しませんので、いくつかの検証は、考慮すべき賢明な

0

一つのオプションのようになります。要するに

static void Main(string[] args) 
    { 
     string[] test = { "t1", "t2", "t3" }; 

     List<object> combined = new List<object> {1}; 
     combined.AddRange(test); 
     combined.Add("Hello"); 

     TestArray(combined.ToArray()); 
    } 

    static void TestArray(params object[] array) 
    { 
     foreach (var value in array) 
     { 
      Console.WriteLine(value); 
     } 
     Console.ReadLine(); 
    } 

、あなたはにすべての値をマージその配列をメソッドに渡す前に、単一の配列を返します。

あなたがこのルートに行った場合、paramsキーワードを削除することを検討してください。そうすれば、誰かがオリジナルの方法でそれを呼び出すことは文字通り不可能になります。 IEnumerableをどのように処理するかを考えるようにします。

+0

paramsの目的を無効にします。もう1つのパラメータ(例えば、 'TestArray(combined.ToArray()、" something ");)を追加すると、コードが壊れます。メソッドは機能しますが、本質的に1つのコレクションしか受け付けないので、パラメータは不要です。 – EpicKip

+0

@エピックキップ! – mjwills

関連する問題