106 votes

Ajouter dynamiquement des propriétés C# au moment de l'exécution

Je sais que certaines questions traitent de ce sujet, mais les réponses consistent généralement à recommander un dictionnaire ou une collection de paramètres, ce qui ne fonctionne pas dans mon cas.

J'utilise une bibliothèque qui fonctionne par réflexion pour faire beaucoup de choses intelligentes avec des objets ayant des propriétés. Cela fonctionne avec des classes définies, ainsi qu'avec des classes dynamiques. J'ai besoin d'aller un peu plus loin et de faire quelque chose de ce genre :

public static object GetDynamicObject(Dictionary<string,object> properties) {
    var myObject = new object();
    foreach (var property in properties) {
        //This next line obviously doesn't work... 
        myObject.AddProperty(property.Key,property.Value);
    }
    return myObject;
}

public void Main() {
    var properties = new Dictionary<string,object>();
    properties.Add("Property1",aCustomClassInstance);
    properties.Add("Property2","TestString2");

    var myObject = GetDynamicObject(properties);

    //Then use them like this (or rather the plug in uses them through reflection)
    var customClass = myObject.Property1;
    var myString = myObject.Property2;

}

La bibliothèque fonctionne bien avec un type de variable dynamique, avec des propriétés assignées manuellement. Cependant, je ne sais pas combien ni quelles propriétés seront ajoutées à l'avance.

53voto

Paul Grimshaw Points 3004

Merci @Clint pour cette excellente réponse :

Je voulais juste souligner combien il était facile de résoudre ce problème en utilisant l'objet Expando :

var dynamicObject = new ExpandoObject() as IDictionary<string, Object>;
foreach (var property in properties) {
    dynamicObject.Add(property.Key,property.Value);
}

8voto

Khurshid Ali Points 101

Vous pourriez désérialiser votre chaîne json dans un dictionnaire, puis ajouter de nouvelles propriétés et enfin la sérialiser.

var jsonString = @"{}";

var jsonDoc = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonString);

jsonDoc.Add("Name", "Khurshid Ali");

Console.WriteLine(JsonSerializer.Serialize(jsonDoc));

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