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.

Dmytro
la source

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.

Mario Sannum
la source
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);
AlienFromCA
la source
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;
pas jeter
la source
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

Kishore Kumar
la source
9
dynamic myDynamic = new { PropertyOne = true, PropertyTwo = false};
smedasn
la source
7
dynamic MyDynamic = new ExpandoObject();
Davecz
la source
7
 var data = new { studentId = 1, StudentName = "abc" };  

Ou la valeur est présente

  var data = new { studentId, StudentName };
Roche
la source