60 votes

Ajouter dynamiquement des propriétés à un objet existant

Je crée l'objet personne comme suit.

 Person person=new Person("Sam","Lewis") 

Ses propriétés sont les suivantes.

person.Dob
person.Address

Mais maintenant, je veux ajouter des propriétés comme celle-ci et définir les valeurs au moment de l'exécution après la création de l'objet. personne.âge personne.Sexe

Comment puis-je ajouter ces propriétés supplémentaires après avoir créé l'objet ? Le nom de ces propriétés peut être modifié de temps à autre. Il n'est donc pas possible de coder en dur l'âge et le sexe.

0 votes

Ceci devrait aider, j'espère gamedev.net/topic/

0 votes

2voto

Nick Kovalsky Points 907

Une autre implémentation, l'utilisant pour combiner des paramètres lors de l'appel d'aides ASP :

    public static object CombineObjects(this object item, object add)
    {
        var ret = new ExpandoObject() as IDictionary<string, Object>;

        var props = item.GetType().GetProperties();
        foreach (var property in props)
        {
            if (property.CanRead)
            {
                ret[property.Name]= property.GetValue(item);
            }
        }

        props = add.GetType().GetProperties();
        foreach (var property in props)
        {
            if (property.CanRead)
            {
                ret[property.Name] = property.GetValue(add);
            }
        }

        return ret;
    }

1voto

zcoop98 Points 1557

Une autre solution pour résoudre ce problème (en fonction de votre situation) consiste à utiliser l'effet de levier L'interface de Newtonsoft.Json ExpandoObjectConverter Classe de convertisseur JSON .

Sérialisez votre objet en JSON, puis désérialisez-le sous la forme d'un fichier ExpandoObject en un dynamic à l'aide du convertisseur :

Person person = new Person("Sam", "Lewis");
var personJson = JsonConvert.SerializeObject(person);
dynamic personExpando = 
    JsonConvert.DeserializeObject<ExpandoObject>(personJson, new ExpandoObjectConverter());

personExpando.Dob = "1/1/1900";
personExpando.Address = "777 Pearly Gates Dr.";

Le nouvel objet que vous obtiendrez aura les propriétés telles que vous les avez ajoutées :

{
  "FirstName": "Sam",
  "LastName": "Lewis",
  "Dob": "1/1/1900",
  "Address": "777 Pearly Gates Dr."
}

Il convient toutefois de noter que la version originale de la person est inchangé ; nous n'avons pas du tout modifié cet objet.

Les mises en garde habituelles concernant la sérialisation JSON s'appliquent, votre kilométrage peut donc varier, mais si vos champs sont correctement sérialisables et que votre objet n'est pas profondément imbriqué, cela ne devrait pas poser de problème.


Soit dit en passant, vous devez absolument développer ou créer un contrat adapté pour les champs de votre objet au lieu d'utiliser ceci dans pratiquement tous les cas. Cela sera plus robuste, plus facile à maintenir et vous évitera les bogues et les erreurs liées au type qui peuvent survenir avec les solutions de contournement.

Cela dit, il arrive que les choses ne soient pas aussi nettes, et il peut donc être utile de disposer d'une telle échappatoire dans des situations exceptionnelles, mais il ne faut pas l'utiliser sans raison valable.

0voto

scarmuega Points 55

Jetez un coup d'œil à la bibliothèque de Clay :

http://clay.codeplex.com/

Il offre des fonctionnalités similaires à celles d'ExpandoObject, mais avec un grand nombre de caractéristiques supplémentaires. Voici un article de blog expliquant comment l'utiliser :

http://weblogs.asp.net/bleroy/archive/2010/08/18/clay-malleable-c-dynamic-objects-part-2.aspx

(lisez bien l'exemple de l'interface IPerson)

0voto

Itaca Points 21

Si vous avez une classe avec une propriété d'objet, ou si votre propriété est en fait un objet, vous pouvez remodeler l'objet en réaffectant ses propriétés, comme dans l'exemple suivant :

  MyClass varClass = new MyClass();
  varClass.propObjectProperty = new { Id = 1, Description = "test" };

  //if you need to treat the class as an object
  var varObjectProperty = ((dynamic)varClass).propObjectProperty;
  ((dynamic)varClass).propObjectProperty = new { Id = varObjectProperty.Id, Description = varObjectProperty.Description, NewDynamicProperty = "new dynamic property description" };

  //if your property is an object, instead
  var varObjectProperty = varClass.propObjectProperty;
  varClass.propObjectProperty = new { Id = ((dynamic)varObjectProperty).Id, Description = ((dynamic)varObjectProperty).Description, NewDynamicProperty = "new dynamic property description" };

Avec cette approche, vous réécrivez la propriété de l'objet en ajoutant ou en supprimant des propriétés comme si vous créiez d'abord l'objet à l'aide de la fonction

new { ... }

syntaxe.

Dans votre cas particulier, il est probablement préférable de créer un objet réel auquel vous attribuez des propriétés telles que "dob" et "address" comme s'il s'agissait d'une personne et, à la fin du processus, de transférer les propriétés à l'objet réel "Person".

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