2009-07-29 7 views
0

J'essaie de comprendre comment convertir un tableau arbitraire ou une collection à une chaîne par réflexion et il me rend fou ... NUTS ... Je suis à peu près yay près de mettre mon swingline rouge à travers l'écran d'ordinateur ici. Par exemple, étant donné un tableau d'objets Color, je veux la représentation par défaut de ce tableau (vous savez, délimité par des points-virgules ou autre) en utilisant un ArrayConverter ou un ColorConverter ou tout autre convertisseur approprié. Je peux le faire pour les types d'objets simples mais les collections m'échappent.Convertir C# Array en String en utilisant Reflection/Type de conversion

Voici comment j'arrête les propriétés d'un objet (arbitraire) en utilisant la réflexion. Comment puis-je convertir génériquement un tableau contenant des types arbitraires en une représentation de chaîne standard en utilisant le convertisseur approprié?

Type t = widget.GetType(); 

System.Reflection.PropertyInfo[] props = t.GetProperties(); 
foreach (PropertyInfo prop in props) 
{ 
    TypeConverter converter = TypeDescriptor.GetConverter(prop.PropertyType); 
    if (converter != null) 
    { 
     object o = prop.GetValue(widget, null); 
     att.Value = converter.ConvertToString(o); 
     // This returns some BS like "System.Array [2]" 
     // I need the actual data. 
    } 
} 

EDIT: Si j'essaie ceci:

att.Value = o.ToString(); 

Il retourne: "System.Drawing.Color []". Alors que je veux "255,202,101,127,127,127" ou quelle que soit la représentation de chaîne par défaut est utilisée par exemple dans un éditeur de propriétés.

Merci!

+0

Si vous demandez les visualiseurs de débogage VS, je ne pense pas que ce soient en le CLR redistribuable. –

Répondre

3

Il n'existe pas de "représentation de chaîne standard d'un tableau". Mais vous pouvez toujours:

string stringRepresentation = 
    string.Join(",", 
     Array.Convert<Foo, string>(delegate(Foo f) { return f.ToString(); })); 
+2

Je pense qu'il veut utiliser la réflexion pour sérialiser les propriétés d'un objet à une chaîne sans avoir à écrire une fonction de mappage à la main. 95% du temps, f.ToString() renverra le nom de la classe, ce qui n'est pas très utile. – Juliet

0

Juste appeler ToString() sur les membres individuels ensemble devrait fonctionner ...

object[] data = GetData(); 
string convertedData = String.Join(",",(from item in data select item.ToString()).ToArray()); 
Questions connexes