2009-09-08 4 views
5

Quelles sont les implications sur les performances de l'association de méthodes et de propriétés lors de l'exécution à l'aide de fonctions dynamiques, comme décrit dans this blog post?Association de propriétés et de méthodes lors de l'exécution en C# 4.0?

Quelles sont les utilisations pratiques de ExpandoObject?

+0

en double possible de [ Quels sont les vrais avantages d'ExpandoObject?] (Http://stackoverflow.com/questions/1653046/what-are-the-true-benefits-of-expandoobject) – nawfal

Répondre

10

Eh bien, vous n'êtes pas vraiment attacher des méthodes et des propriétés à l'objet. Pas aussi loin que le CLR est concerné. Vous ajoutez simplement des entrées dans un dictionnaire et lorsque l'implémentation ExpandoObject de IDynamicMetaObjectProvider est demandée pour la valeur de la propriété (ou demandée pour exécuter la méthode), elle agit en conséquence.

Les performances vont évidemment être plus lentes que les accès statiquement liés aux méthodes/propriétés, mais le DLR est plutôt nippy. Mon souci personnel n'est pas tant la performance que le manque de sécurité de type - une faute de frappe peut facilement visser votre code sans que le compilateur l'ait repéré.

Mon conseil personnel est de n'utiliser le typage dynamique qu'en C# 4 où il donne un avantage très clair ... que je m'attends à être relativement rare (comme un code dangereux).

Utilise pour ExpandoObject? Pas beaucoup, OMI - surtout quand on parle à d'autres langues dynamiques.

+0

Whoa, cela commence à ressembler à une programmation basée sur un prototype. En outre, pourrait-il être utilisé pour émuler l'injection de classe de base [par assemblage]? –

+3

Relativement rare ?! Vous monsieur, n'êtes pas un programmeur Ruby :) –

+3

@Paul: En effet ... parce que nous parlons de C#, plutôt que de Ruby. En tant que langage fondamentalement typé, je crois qu'il sera relativement rare de transformer C# en un mash-mash de typage statique et dynamique. Si vous souhaitez utiliser intensivement la frappe dynamique, utilisez IronRuby ou IronPython ... –

2

ExpandoObject concerne le DLR, et est principalement lié pour jouer entre C# et un langage dynamique (peut-être IronPython); cependant, plus généralement, ce type d'objet propriété-sac peut être utile lorsque le schéma de vos types est seulement connu au moment de l'exécution, peut-être basé sur des données de base de données/configuration. Peut-être un exemple de l'anti-modèle de "plate-forme interne", mais il est utile dans des scénarios spécifiques pour attacher des propriétés à l'exécution. Bien sûr, pour une utilisation purement CLR (ie pas d'appels DLR), vous pouvez faire beaucoup plus simplement juste avec un indexeur dictionnaire:

obj["Name"] = "Fred"; 
string name = (string) obj["Name"]; 

Pour des fins de liaison de données, même avec cela, vous pouvez obtenir des données complètes de liaison en utilisant des descripteurs de propriétés personnalisés, via ICustomTypeDescriptor ou TypeDescriptionProvider.

Ou pour un exemple simple: envisager DataTable ... c'est en partie ce que vous pouvez faire ici (encore une fois, dans le code statique typé): (exemple non testé)

DataTable table = new DataTable(); 
table.Columns.Add("Name", typeof(string)); 
DataRow row = table.Rows.Add("Fred"); 
Questions connexes