2009-09-08 10 views
5

Quali sono le implicazioni in termini di prestazioni del collegamento di metodi e proprietà in fase di esecuzione utilizzando le funzioni dinamiche, come descritto in this blog post?Associazione di proprietà e metodi in fase di esecuzione in C# 4.0?

Quali sono gli usi pratici di ExpandoObject?

+0

possibile duplicato di [ Quali sono i veri vantaggi di ExpandoObject?] (Http://stackoverflow.com/questions/1653046/what-are-the-true-benefits-of-expandoobject) – nawfal

risposta

10

Bene, non si è davvero associare metodi e proprietà all'oggetto. Non per quanto riguarda il CLR. Stai solo aggiungendo voci in un dizionario e quando l'implementazione ExpandoObject di IDynamicMetaObjectProvider viene richiesta per il valore della proprietà (o viene richiesto di eseguire il metodo), agirà di conseguenza.

Le prestazioni sono ovviamente più lente dell'accesso statico a metodi/proprietà, ma la DLR è piuttosto semplice. La mia preoccupazione personale non è tanto la performance quanto la mancanza di sicurezza del tipo: un errore di battitura può facilmente avvitare il codice senza che il compilatore lo individuasse.

Il mio consiglio personale è quello di utilizzare solo la digitazione dinamica in C# 4 dove fornisce un vantaggio molto chiaro ... che mi aspetto essere relativamente raro (come codice non sicuro).

Utilizzi per ExpandoObject? Non molti, IMO - soprattutto quando si parla con altre lingue dinamiche.

+0

Whoa, questo inizia ad assomigliare alla programmazione basata su prototipi. Oltre a ciò, potrebbe essere usato per emulare un'iniezione di classe base [per-assembly]? –

+3

Relativamente raro ?! Tu signore, non sei un programmatore Ruby :) –

+3

@Paul: Infatti ... perché stiamo parlando di C#, piuttosto che di Ruby. Essendo un linguaggio tipicamente statico, credo sia relativamente raro trasformare il C# in un miscuglio di tipizzazione statica e dinamica. Se si desidera utilizzare la digitazione dinamica in modo esteso, utilizzare IronRuby o IronPython ... –

2

ExpandoObject si riferisce al DLR ed è principalmente correlato per la riproduzione tra C# e un linguaggio dinamico (forse IronPython); tuttavia, più in generale questo tipo di oggetto property-bag può essere utile quando lo schema dei tipi è noto solo al runtime, magari in base ai dati del database/ai dati di configurazione. Forse un esempio di anti-pattern "piattaforma interna", ma è utile in scenari specifici per collegare le proprietà in fase di esecuzione. Naturalmente, per un utilizzo prettamente CLR (cioè senza i chiamanti DLR) si può fare questo molto più semplicemente con un indicizzatore e il dizionario:

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

Per scopi di associazione dati, anche con questo è possibile ottenere dati completi vincolanti utilizzando descrittori di proprietà personalizzati, tramite ICustomTypeDescriptor o TypeDescriptionProvider.

O per un semplice esempio: considerare DataTable ... questo è in parte che cosa si può fare qui (ancora una volta, in codice statico-digitato): (Esempio non testata)

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