192 votes

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

Il y a, par exemple, le ViewBag propriété de ControllerBase et nous pouvons obtenir/définir dynamiquement des valeurs et ajouter un nombre quelconque 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 Controller dans d'autres types d'applications. Lorsque j'ai essayé de créer dynamique et définir sa propriété comme ceci :

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

J'ai RuntimeBinderException avec message La propriété ou l'indexeur '<>f__AnonymousType0.A' ne peut pas être assigné à -- il est en lecture seule. dans la ligne 2. De plus, je pense que ce n'est pas tout à fait ce que je recherche. Peut-être existe-t-il une classe qui me permette de faire quelque chose comme :

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

avec l'ajout et le réglage dynamiques de propriétés.

366voto

Mario Points 5518
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 Classe ExpandoObject et pour plus d'échantillons : Représente un objet dont les membres peuvent être ajoutés et supprimés dynamiquement au moment de l'exécution.

51voto

AlienFromCA Points 21

J'ai récemment eu besoin d'aller plus loin, c'est-à-dire de faire en sorte que les propriétés ajoutées dans l'objet dynamique soient elles-mêmes dynamiques, sur la base d'entrées définies par l'utilisateur. Les exemples présentés ici et dans Documentation ExpandoObject de Microsoft L'ajout de propriétés de manière dynamique n'est pas abordé de manière spécifique, mais on peut le supposer à partir de la manière dont les propriétés sont énumérées et supprimées. Quoi qu'il en soit, j'ai pensé que cela pourrait être utile à quelqu'un. Voici une version extrêmement simplifiée de la manière d'ajouter des propriétés réellement 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);

48voto

smedasn Points 735
dynamic myDynamic = new { PropertyOne = true, PropertyTwo = false};

35voto

Yossarian Points 8601

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;

26voto

Rock Points 79
var data = new { studentId = 1, StudentName = "abc" };  

Ou la valeur est présente

var data = new { studentId, StudentName };

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