web-dev-qa-db-fra.com

Comment convertir une classe en Dictionnaire <chaîne, chaîne>?

Maintenant, je vous explique encore une fois mon enthousiasme pour Dictionary! Cette question est surgie dans mon esprit de la réponse de mon question précédente !!

Maintenant, le point réel est Puis-je convertir la classe en dictionnaire?

Dans le dictionnaire, je veux que mes propriétés de classe soient [~ # ~] clé [~ # ~] et la valeur d'une propriété particulière comme [~ # ~] valeur [~ # ~]

Supposons que ma classe soit

public class Location
{
    public string city { get; set; }
    public string state { get; set; }
    public string country { get; set;
}

Supposons maintenant que mes données soient

city = Delhi
state = Delhi
country = India

Vous pouvez maintenant comprendre mon point facilement!

Je veux faire un dictionnaire! Ce dictionnaire devrait être comme

Dictionary<string,string> dix = new Dictionary<string,string> ();
dix.add("property_name", "property_value");

Je peux obtenir la valeur! Mais comment puis-je obtenir les noms de propriété ( et non la valeur )?

Que dois-je coder pour le créer dynamique! Cela devrait fonctionner pour chaque classe que je veux?

Vous pouvez comprendre cette question comme

Comment puis-je obtenir la liste des propriétés d'une classe particulière?

57
Chintan

Voici la recette: 1 réflexion, 1 LINQ-to-Objects!

 someObject.GetType()
     .GetProperties(BindingFlags.Instance | BindingFlags.Public)
          .ToDictionary(prop => prop.Name, prop => prop.GetValue(someObject, null))

Depuis que j'ai publié cette réponse, j'ai vérifié que beaucoup de gens l'ont trouvée utile. J'invite tous ceux qui recherchent cette solution simple à vérifier un autre Q&R où je l'ai généralisé dans une méthode d'extension: Mappage d'un objet au dictionnaire et vice versa .

139
Matías Fidemraizer

Voici un exemple avec réflexion sans linq:

    Location local = new Location();
    local.city = "Lisbon";
    local.country = "Portugal";
    local.state = "None";

    PropertyInfo[] infos = local.GetType().GetProperties();

    Dictionary<string,string> dix = new Dictionary<string,string> ();

    foreach (PropertyInfo info in infos)
    {
        dix.Add(info.Name, info.GetValue(local, null).ToString());
    }

    foreach (string key in dix.Keys)
    {
        Console.WriteLine("nameProperty: {0}; value: {1}", key, dix[key]);
    }

    Console.Read();
16
Bruno Costa

Je voudrais ajouter une alternative à la réflexion, en utilisant JToken. Vous devrez vérifier la différence de référence entre les deux pour voir laquelle a de meilleures performances.

var location = new Location() { City = "London" };
var locationToken = JToken.FromObject(location);
var locationObject = locationObject.Value<JObject>();
var locationPropertyList = locationObject.Properties()
    .Select(x => new KeyValuePair<string, string>(x.Name, x.Value.ToString()));

Notez que cette méthode est préférable pour une structure de classe plate.

1
FishFingers

Essayez ceci.

    public static Dictionary<string, object> ObjectToDictionary(object obj)
    {
        Dictionary<string, object> ret = new Dictionary<string, object>();

        foreach (PropertyInfo prop in obj.GetType().GetProperties())
        {
            string propName = prop.Name;
            var val = obj.GetType().GetProperty(propName).GetValue(obj, null);
            if (val != null)
            {
                ret.Add(propName, val.ToString());
            }
            else
            {
                ret.Add(propName, null);
            }
        }

        return ret;
    }
0
joelc
protected string getExamTimeBlock(object dataItem)
{
    var dt = ((System.Collections.Specialized.StringDictionary)(dataItem));

    if (SPContext.Current.Web.CurrencyLocaleID == 1033) return dt["en"];
    else return dt["sv"];
}
0
Jon