Si vous avez une classe que vous voulez convertir le dictionnaire aussi, vous pouvez utiliser ce qui suit pour convertir un dictionnaire en un objet de cette classe :
Exemple de classe :
public class Properties1
{
public string Property { get; set; }
}
La solution :
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary dict = new Dictionary { { "Property", "foo" } };
Properties1 properties = serializer.ConvertToType<Properties1>(dict);
string value = properties.Property;
Vous pouvez également utiliser une méthode comme celle-ci pour construire l'objet à partir du dictionnaire, évidemment cela nécessite également que vous ayez une classe.
private static T DictionaryToObject(IDictionary dict) where T : new()
{
T t = new T();
PropertyInfo[] properties = t.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
if (!dict.Any(x => x.Key.Equals(property.Name,
StringComparison.InvariantCultureIgnoreCase)))
continue;
KeyValuePair item = dict.First(x => x.Key.Equals(property.Name,
StringComparison.InvariantCultureIgnoreCase));
Type tPropertyType = t.GetType().GetProperty(property.Name).PropertyType;
Type newT = Nullable.GetUnderlyingType(tPropertyType) ?? tPropertyType;
object newA = Convert.ChangeType(item.Value, newT);
t.GetType().GetProperty(property.Name).SetValue(t, newA, null);
}
return t;
}
Cependant, si vous n'avez pas la classe, vous pouvez créer un objet dynamique à partir d'un dictionnaire comme ceci :
private static dynamic DictionaryToObject(Dictionary dict)
{
IDictionary eo = (IDictionary)new ExpandoObject();
foreach (KeyValuePair kvp in dict)
{
eo.Add(kvp);
}
return eo;
}
Vous pouvez l'utiliser comme ceci :
Dictionary dict = new Dictionary {{ "Property", "foo" }};
dynamic properties = DictionaryToObject(dict);
string value = properties.Property;
0 votes
Quelle est la raison pour laquelle vous voulez faire cela?
1 votes
Je doute que vous puissiez facilement prendre en charge un ensemble arbitraire de paires clé-valeur - vous devriez construire dynamiquement un nouveau type avec ces propriétés au moment de l'exécution. Étant donné que vous allez ensuite les lire, il serait préférable de créer une surcharge qui accepte également votre dictionnaire.
0 votes
@Rup: En fait, c'est aussi une alternative raisonnable. J'ai déjà trouvé un raccourci qui fonctionne bien pour mes besoins, mais j'aimerais quand même connaître la réponse à ma question ci-dessus... juste par curiosité :)
0 votes
Vérifiez les liens suivants, très bonne solution pour la conversion de dictionnaire en type anonyme : jacobcarpenter.wordpress.com/2008/03/13/… tomsundev.wordpress.com/2011/07/20/…