2012-05-24 19 views
38

オブジェクト(ここでは 'obj':オブジェクトは配列、プリミティブであると宣言しています)を文字列配列に変換しようとしています。オブジェクトを文字列配列

オブジェクトは、私は[私がオブジェクトに未知のタイプのオブジェクトをキャストしようとすると問題が発生する

string[] str = Array.ConvertAll<object, string>((object[])obj, Convert.ToString); 

を使用しようとしている[]、INT16 []など

UINT何もすることができます]。 キャストエラーが発生しました。失敗した私が作った

一つの試みは、私はキャストの値型と参照型の問題に関する投稿を見た

IEnumerable<object> list = obj as IEnumerable<object> 
object[] arr = (object[])list; 

object[] arr = (object[])obj; 

または

を使用していました。

配列である限り、オブジェクトの型に関係なくオブジェクト[]への型変換を処理できる簡単なコードがありますか? 私はすべての可能な型キャストの手動処理を避けようとしています。事前

+1

あなたは、値型の配列をキャストすることはできません'object []'には互換性がありません。 –

答えて

62

おかげであなたはすべての配列はIEnumerableを実装しているという事実を使用することができます

string[] arr = ((IEnumerable)obj).Cast<object>() 
           .Select(x => x.ToString()) 
           .ToArray(); 

これは、文字列に変換する前に、適切なプリミティブ箱れます。

キャストが失敗した理由は参照型の配列は共変ではあるが、型の配列ではないということです。

object[] x = new string[10]; // Fine 
object[] y = new int[10]; // Fails 

はちょうどIEnumerableへのキャストはしかし動作します。あなたが望むならば、あなたはArrayにキャストすることができます。

+0

ボックスプリミティブが必要な理由は何ですか? – Douglas

+0

@Douglas:プリミティブ型の配列を 'object []'にキャストすることはできず、あらかじめその型を知らないので。 –

+0

'IEnumerable'にキャストしなくても動作しますが、なぜそれをesplicityにキャストしたいのですか? – Tigran

10

それは常にいくつかのタイプ(配列、リスト、等...)のコレクションの場合は、昔ながらのSystem.Collections.IEnumerableに戻ってキャストしてみてください。ここで

string[] str = ((System.Collections.IEnumerable)obj) 
    .Cast<object>() 
    .Select(x => x.ToString()) 
    .ToArray(); 

そこから行くには、非処理し、より徹底した実装であります-collections同様

static string[] ToStringArray(object arg) { 
    var collection = arg as System.Collections.IEnumerable; 
    if (collection != null) { 
    return collection 
     .Cast<object>() 
     .Select(x => x.ToString()) 
     .ToArray(); 
    } 

    if (arg == null) { 
    return new string[] { }; 
    } 

    return new string[] { arg.ToString() }; 
} 
+0

ありがとう、それは素晴らしい作品 –

-1

私の例:

public class TestObject 
    { 
     public string Property1 { get; set; } 

     public string Property2 { get; set; } 

     public string Property3 { get; set; } 
    } 



    static void Main(string[] args) 
    { 
     List<TestObject> testObjectList = new List<TestObject> 
     { 
      new TestObject() { Property1 = "1", Property2 = "2", Property3 = "3" }, 
      new TestObject() { Property1 = "1", Property2 = "2", Property3 = "3" }, 
      new TestObject() { Property1 = "1", Property2 = "2", Property3 = "3" } 
     }; 

     List<string[]> convertedTestObjectList = testObjectList.Select(x => new string[] { x.Property1, x.Property2, x.Property3 }).ToList(); 
    }