53

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

オブジェクトには、uint []、int16[]などを指定できます。

私は使用しようとしています

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

不明なタイプのオブジェクトをobject[]にキャストしようとすると、問題が発生します。キャストエラーが発生しています。

私が行った試みの1つは失敗しましたが、

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

また

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

キャストに関する値型と参照型の問題に関する投稿を見ました。

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

前もって感謝します

4

3 に答える 3

82

すべての配列が以下を実装しているという事実を利用できます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ます。

于 2012-05-24T21:30:17.983 に答える
16

それが常に何らかのタイプ(配列、リストなど)のコレクションである場合は、単純な古いものにキャストしてSystem.Collections.IEnumerable、そこから移動してみてください

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

これは、非コレクションも処理するより徹底的な実装です

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() };
}
于 2012-05-24T21:31:04.667 に答える
-2

私の例:

   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();
    }
于 2016-08-31T09:09:57.017 に答える