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