web-dev-qa-db-fra.com

objet à chaîne

J'essaie de convertir un objet (déclaré ici comme 'obj': objet est tableau, primitif) en tableau de chaînes.

objet peut être n'importe quoi uint [], int16 [], etc.

J'ai essayé d'utiliser

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

Le problème survient lorsque j'essaie de convertir l'objet de type inconnu en objet []. J'ai eu une erreur de casting.

Une de mes tentatives, qui a échoué, consistait à utiliser

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

ou

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

J'ai vu des messages concernant le type de valeur et le problème de type de référence lors du casting.

Existe-t-il un code simple capable de gérer la conversion en objet [] quel que soit le type d'objet, tant qu'il s'agit d'un tableau? J'essaie d'éviter la manipulation manuelle de tous les types possibles.

merci d'avance

45
swcraft

Vous pouvez utiliser le fait que chaque tableau implémente IEnumerable:

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

Cela encochera les primitives de manière appropriée avant de les convertir en chaînes.

La raison de l'échec de la conversion est que, bien que les tableaux de types référence soient covariants, les tableaux de types valeur ne sont pas:

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

La diffusion sur IEnumerable ne fonctionnera pas. Heck, vous pouvez lancer Array si vous le souhaitez.

73
Jon Skeet

S'il s'agit toujours d'une collection d'un type quelconque (tableau, liste, etc.), essayez de reconvertir plaine en vieux System.Collections.IEnumerable et partir de là

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

Voici une implémentation plus complète qui gère également les non-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() };
}
12
JaredPar