web-dev-qa-db-de.com

Objekt zu String Array

Ich versuche ein Objekt (wird hier als 'obj' deklariert: Objekt ist Array, primitiv) in ein String-Array zu konvertieren.

objekt kann alles sein uint [], int16 [], etc.

Ich habe versucht zu verwenden

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

Das Problem tritt auf, wenn ich versuche, das Objekt des unbekannten Typs in Objekt [] umzuwandeln. Ich habe einen Gießfehler bekommen.

Ein Versuch, den ich machte, der fehlschlug, war das Verwenden

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

oder

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

Ich habe beim Casting Postings zu den Themen Werttyp und Referenztyp gesehen.

Gibt es einen einfachen Code, der das Umwandeln in object [] unabhängig vom Objekttyp verarbeiten kann, solange es sich um ein Array handelt? Ich versuche, die manuelle Handhabung jedes möglichen Gusstyps zu vermeiden.

danke im Voraus

45
swcraft

Sie können die Tatsache verwenden, dass jedes Array IEnumerable implementiert:

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

Dadurch werden die Grundelemente vor dem Konvertieren in Zeichenfolgen in geeigneter Weise umrahmt.

Der Grund, warum die Umwandlung fehlschlägt, ist, dass Arrays von Referenz -Typen zwar kovariant sind, Arrays von Wert -Typen jedoch nicht:

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

Das Casting auf nur IEnumerable funktioniert jedoch. Du könntest nach Array gehen, wenn du willst.

73
Jon Skeet

Wenn es sich immer um eine Sammlung irgendeiner Art handelt (Array, Liste usw.), dann versuchen Sie, das Casting auf ein einfaches altes System.Collections.IEnumerable und geh von dort

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

Hier ist eine gründlichere Implementierung, die auch Nicht-Sammlungen behandelt

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() };
}
12
JaredPar