79 votes

En c # convertit le type anonyme en tableau clé / valeur?

J'ai le type anonyme suivant:

 new {data1 = "test1", data2 = "sam", data3 = "bob"}
 

J'ai besoin d'une méthode qui prendra cela en compte et produira des paires clé-valeur dans un tableau ou un dictionnaire.

Mon objectif est d'utiliser ceci comme données de publication dans une requête HttpRequest afin que je finisse par concaténer dans la chaîne suivante:

 "data1=test1&data2=sam&data3=bob"
 

124voto

kbrimington Points 14081

Cela prend juste un petit peu de réflexion à accomplir.

 var a = new { data1 = "test1", data2 = "sam", data3 = "bob" };
var type = a.GetType();
var props = type.GetProperties();
var pairs = props.Select(x => x.Name + "=" + x.GetValue(a, null)).ToArray();
var result = string.Join("&", pairs);
 

63voto

GWB Points 1034

Si vous utilisez .NET 3.5 SP1 ou .NET 4, vous pouvez (ab) utiliser RouteValueDictionary pour cela. Il implémente IDictionary<string, object> et a un constructeur qui accepte object et convertit les propriétés en paires clé-valeur.

Il serait alors facile de parcourir les clés et les valeurs pour créer votre chaîne de requête.

1voto

Andiih Points 7331

La solution de @ kbrimington fait une méthode d'extension agréable - mon cas me renvoyant un HtmlString

     public static System.Web.HtmlString ToHTMLAttributeString(this Object attributes)
    {
        var props = attributes.GetType().GetProperties();
        var pairs = props.Select(x => string.Format(@"{0}=""{1}""",x.Name,x.GetValue(attributes, null))).ToArray();
        return new HtmlString(string.Join(" ", pairs));
    }
 

Je l'utilise pour déposer des attributs arbitraires dans une vue Razor MVC. J'ai commencé avec du code en utilisant RouteValueDictionary et en boucle sur les résultats, mais c'est beaucoup plus net.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X