Comment créer son propre type dynamique ou objet dynamique en C #?


130

Il y a par exemple la propriété ViewBag de la ControllerBaseclasse et nous pouvons dynamiquement obtenir / définir des valeurs et ajouter un nombre illimité de champs ou de propriétés supplémentaires à cet objet, ce qui est cool.Je veux utiliser quelque chose comme ça, au-delà de l'application MVC et de la Controllerclasse dans d'autres types d'applications. Lorsque j'ai essayé de créer un objet dynamique et de définir sa propriété comme ci-dessous:

1. dynamic MyDynamic = new { A="a" };
2. MyDynamic.A = "asd";
3. Console.WriteLine(MyDynamic.A);

J'ai RuntimeBinderExceptionavec le message Property ou indexer '<> f__AnonymousType0.A' ne peut pas être affecté à - il est en lecture seule à la ligne 2. Aussi je suggère que ce n'est pas tout à fait ce que je recherche. Peut-être y a-t-il une classe qui peut me permettre de faire quelque chose comme:

??? MyDynamic = new ???();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = DateTime.Now;
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42;

avec des propriétés d'ajout et de réglage dynamiques.

Réponses:


279
dynamic MyDynamic = new System.Dynamic.ExpandoObject();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = "C";
MyDynamic.Number = 12;
MyDynamic.MyMethod = new Func<int>(() => 
{ 
    return 55; 
});
Console.WriteLine(MyDynamic.MyMethod());

En savoir plus sur la classe ExpandoObject et pour plus d'exemples: représente un objet dont les membres peuvent être ajoutés et supprimés dynamiquement au moment de l'exécution.


3
Veuillez voter pour cette fonctionnalité dans Visual Studio UserVoice .
orad

33

J'ai récemment eu besoin d'aller plus loin, qui consistait à rendre les ajouts de propriété dans l'objet dynamique, eux-mêmes dynamiques, en fonction des entrées définies par l'utilisateur. Les exemples ici et de la documentation ExpandoObject de Microsoft ne traitent pas spécifiquement de l'ajout de propriétés de manière dynamique, mais peuvent être supposés à partir de la façon dont vous énumérez et supprimez les propriétés. Quoi qu'il en soit, j'ai pensé que cela pourrait être utile à quelqu'un. Voici une version extrêmement simplifiée de la façon d'ajouter des propriétés vraiment dynamiques à un ExpandoObject (en ignorant les mots clés et autres manipulations):

        // my pretend dataset
        List<string> fields = new List<string>();
        // my 'columns'
        fields.Add("this_thing");
        fields.Add("that_thing");
        fields.Add("the_other");

        dynamic exo = new System.Dynamic.ExpandoObject();

        foreach (string field in fields)
        {
            ((IDictionary<String, Object>)exo).Add(field, field + "_data");
        }

        // output - from Json.Net NuGet package
        textBox1.Text = Newtonsoft.Json.JsonConvert.SerializeObject(exo);

32

ExpandoObject est ce que vous recherchez.

dynamic MyDynamic = new ExpandoObject(); // note, the type MUST be dynamic to use dynamic invoking.
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = "C";
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42;

11

Vous pouvez utiliser ExpandoObject Classqui est dans l' System.Dynamicespace de noms.

dynamic MyDynamic = new ExpandoObject();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = "C";
MyDynamic.SomeProperty = SomeValue
MyDynamic.number = 10;
MyDynamic.Increment = (Action)(() => { MyDynamic.number++; });

Plus d'informations peuvent être trouvées sur ExpandoObject MSDN


9
dynamic myDynamic = new { PropertyOne = true, PropertyTwo = false};


7
 var data = new { studentId = 1, StudentName = "abc" };  

Ou la valeur est présente

  var data = new { studentId, StudentName };
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.