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.
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.
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;
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);
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
dynamic MyDynamic = new ExpandoObject();