web-dev-qa-db-fra.com

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

Voici, par exemple, ViewBag propriété de ControllerBase class et nous pouvons dynamiquement obtenir/définir des valeurs et ajouter un nombre quelconque de champs ou de propriétés supplémentaires à cet objet, ce qui est pratique. Je souhaite utilisez quelque chose comme ça, au-delà de l'application MVC et de la classe Controller dans d'autres types d'applications. Quand j'ai essayé de créer l'objet dynamique et de le définir comme suit:

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

J'ai RuntimeBinderException avec le message La propriété ou l'indexeur '<> f__AnonymousType0.A' ne peuvent pas être affectés - il est en lecture seule dans 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 ajout dynamique et propriétés de réglage.

116
Dmytro
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 classe ExpandoObject et pour plus d'exemples: Représente un objet dont les membres peuvent être ajoutés et supprimés de manière dynamique au moment de l'exécution.

252
Mario Sannum

ExpandoObject est ce que vous cherchez.

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;
30
nothrow

J'ai récemment eu besoin d'aller plus loin dans cette étape, qui consistait à rendre les ajouts de propriétés dans l'objet dynamique, eux-mêmes dynamiques, en fonction des entrées définies par l'utilisateur. Les exemples ici, et de documentation ExpandoObject de Microsoft , ne traitent pas spécifiquement de l'ajout dynamique de propriétés, mais peuvent être déduits de la façon dont vous énumérez et supprimez des 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 procédure à suivre pour ajouter des propriétés véritablement dynamiques à un objet ExpandoObject (en ignorant les mots clés et les autres méthodes de traitement):

        // 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);
27
AlienFromCA

Vous pouvez utiliser ExpandoObject Class qui se trouve dans System.Dynamic espace 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 à l'adresse ExpandoObject MSDN

11
Kishore Kumar
dynamic MyDynamic = new ExpandoObject();
7
Davecz