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