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

85voto

Thomas Levesque Points 141081

Ce n'est pas possible avec un objet "normal", mais vous pouvez le faire avec un objet de type ExpandoObject y el dynamic mot-clé :

dynamic person = new ExpandoObject();
person.FirstName = "Sam";
person.LastName = "Lewis";
person.Age = 42;
person.Foo = "Bar";
...

Si vous essayez d'attribuer une propriété qui n'existe pas, elle est ajoutée à l'objet. Si vous essayez d'attribuer une propriété à un objet qui n'existe pas, elle est ajoutée à l'objet. lire une propriété qui n'existe pas, il lèvera une exception. C'est donc à peu près le même comportement qu'un dictionnaire (et ExpandoObject implémente en fait la fonction IDictionary<string, object> )

1 votes

Merci de votre réponse. Mon problème est que je n'obtiens les noms des propriétés qu'au moment de l'exécution. Comme dans votre exemple FirstName, LastName, Age, Foo, je dois savoir comment implémenter les propriétés. J'obtiens les noms des propriétés à partir de la table et je dois créer des propriétés à partir de celle-ci.

4 votes

@Sanjeewa, dans ce cas, votre meilleur choix est probablement d'utiliser un Dictionary<string, object> . ExpandoObject ne sera pas très utile si vous ne connaissez pas les noms des propriétés avant l'exécution.

0 votes

Puis-je utiliser icustomtypedescriptor pour cela ?

13voto

George Duckett Points 17305

Jetez un coup d'œil à la ExpandoObject .

Par exemple :

dynamic person = new ExpandoObject();
person.Name = "Mr bar";
person.Sex = "No Thanks";
person.Age = 123;

Lectures complémentaires aquí .

12voto

Warrick Hunter Points 556

Si vous n'avez besoin des propriétés dynamiques que pour la sérialisation/désérialisation JSON, par exemple si votre API accepte un objet JSON avec différents champs en fonction du contexte, vous pouvez utiliser la méthode JsonExtensionData disponible dans Newtonsoft.Json ou System.Text.Json.

Exemple :

public class Pet
{
    public string Name { get; set; }
    public string Type { get; set; }

    [JsonExtensionData]
    public IDictionary<string, object> AdditionalData { get; set; }
}

Vous pouvez ensuite désérialiser JSON :

public class Program
{
    public static void Main()
    {
        var bingo = JsonConvert.DeserializeObject<Pet>("{\"Name\": \"Bingo\", \"Type\": \"Dog\", \"Legs\": 4 }");
        Console.WriteLine(bingo.AdditionalData["Legs"]);        // 4

        var tweety = JsonConvert.DeserializeObject<Pet>("{\"Name\": \"Tweety Pie\", \"Type\": \"Bird\", \"CanFly\": true }");
        Console.WriteLine(tweety.AdditionalData["CanFly"]);     // True

        tweety.AdditionalData["Color"] = "#ffff00";

        Console.WriteLine(JsonConvert.SerializeObject(tweety)); // {"Name":"Tweety Pie","Type":"Bird","CanFly":true,"Color":"#ffff00"}
    }
}

2 votes

Ce n'est pas la réponse à la question, mais des informations très utiles.

10voto

Grant Thomas Points 28280

Si vous ne pouvez pas utiliser le dynamique type avec ExpandoObject Dans ce cas, vous pouvez utiliser un mécanisme de "sac de propriétés", où, en utilisant un dictionnaire (ou un autre type de collection clé/valeur), vous stockez des chaînes de caractères. key qui nomment les propriétés et value du type requis.

Voir ici pour un exemple de mise en œuvre .

2voto

Georgi Mateev Points 21

Envisagez d'utiliser le modèle de décorateur http://en.wikipedia.org/wiki/Decorator_pattern

Vous pouvez changer le décorateur au moment de l'exécution par un décorateur ayant des propriétés différentes lorsqu'un événement se produit.

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