638 votes

Quels sont les vrais avantages de ExpandoObject ?

Le ExpandoObject classe d'être ajoutés .NET 4 vous permet de fixer arbitrairement les propriétés d'un objet lors de l'exécution.

Quels sont les avantages de ce fil à l'aide d'un Dictionary<string,object>, ou même une table de hachage? Aussi loin que je peux dire, ce n'est rien mais une table de hachage, vous pouvez accéder avec un peu de syntaxe plus concise.

Par exemple, pourquoi est-ce:

dynamic obj = new ExpandoObject();
obj.MyInt = 3;
obj.MyString = "Foo";
Console.WriteLine(obj.MyString);

Vraiment mieux, ou substantiellement différentes, que:

var obj = new Dictionary<string, object>();
obj["MyInt"] = 3;
obj["MyString"] = "Foo";

Console.WriteLine(obj["MyString"]);

Ce réel avantages sont obtenus en utilisant les ExpandoObject au lieu de simplement en utilisant l'arbitraire d'un type de dictionnaire, autres que de ne pas être évident que vous êtes en utilisant un type qui va être déterminé au moment de l'exécution.

756voto

Alexandra Rusina Points 6063

Depuis que j'ai écrit l'article MSDN vous faites allusion, je suppose que je dois répondre à ça.

Tout d'abord, je m'attendais à cette question et c'est pourquoi j'ai écrit un post de blog qui montre de manière plus ou moins réel de cas d'utilisation pour ExpandoObject: Dynamique en C# 4.0: présentation de l'ExpandoObject.

Peu de temps, ExpandoObject peut vous aider à créer des objets hiérarchiques. Par exemple, imaginez que vous avez un dictionnaire dans un dictionnaire:

Dictionary<String, object> dict = new Dictionary<string, object>();
Dictionary<String, object> address = new Dictionary<string,object>();
dict["Address"] = address;
address["State"] = "WA";
Console.WriteLine(((Dictionary<string,object>)dict["Address"])["State"]);

Plus profonde est la hiérarchie, le plus laid, c'est le code. Avec ExpandoObject il reste élégant et lisible.

dynamic expando = new ExpandoObject();
expando.Address = new ExpandoObject();
expando.Address.State = "WA";
Console.WriteLine(expando.Address.State);

Deuxièmement, comme il a déjà été souligné, ExpandoObject implémente l'interface INotifyPropertyChanged qui vous donne plus de contrôle sur les propriétés qu'un dictionnaire.

Enfin, vous pouvez ajouter des événements à ExpandoObject comme ici:

class Program
{

   static void Main(string[] args)
   {
       dynamic d = new ExpandoObject();

       // Initialize the event to null (meaning no handlers)
       d.MyEvent = null;

       // Add some handlers
       d.MyEvent += new EventHandler(OnMyEvent);
       d.MyEvent += new EventHandler(OnMyEvent2);

       // Fire the event
       EventHandler e = d.MyEvent;

       if (e != null)
       {
           e(d, new EventArgs());
       }

       // We could also fire it with...
       //      d.MyEvent(d, new EventArgs());

       // ...if we knew for sure that the event is non-null.
   }

   static void OnMyEvent(object sender, EventArgs e)
   {
       Console.WriteLine("OnMyEvent fired by: {0}", sender);
   }

   static void OnMyEvent2(object sender, EventArgs e)
   {
       Console.WriteLine("OnMyEvent2 fired by: {0}", sender);
   }
}

79voto

itowlson Points 44174

Il est un avantage pour les scénarios de liaison. Grilles de données et les grilles de la propriété reprendra les propriétés dynamiques via le système de TypeDescriptor. En outre, la liaison de données WPF comprendront des propriétés dynamiques, donc les contrôles WPF peuvent lier à une ExpandoObject plus facilement qu’un dictionnaire.

Interopérabilité avec les langages dynamiques, qui attendront les propriétés DLR plutôt que des entrées du dictionnaire, peut également être une considération dans certains scénarios.

54voto

bjull Points 121

Le véritable avantage pour moi est la liaison de données totalement sans effort depuis du code XAML :

...

...

33voto

Drew Marsh Points 22002

Interopérabilité avec d’autres langages, fondées sur la est la raison #1 je peux penser. Vous ne pouvez pas passer un car il n’est pas un . Un autre avantage est qu’elle implémente est ajouté qui signifie dans le monde de la liaison de données de WPF, il a également ajouté avantages au-delà de ce que `` peut vous fournir.

21voto

ChaosPandion Points 37025

Il est tout à propos de commodité de programmeur. Je peux imaginer écrire des programmes rapides et sales avec cet objet.

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