2010-02-13 18 views
59

Penso di avere il mio cervello a metà strada attorno al concetto di tipi dinamici in C# 4, ma non riesco a immaginare uno scenario in cui vorrei davvero usaloC# 4: Esempio di tipi dinamici del mondo reale

Sono sicuro che ci sono molti, ma sto solo difficoltà a effettuare la connessione come avrei potuto progettare una soluzione che è meglio risolto con dinamiche rispetto alle interfacce, l'iniezione di dipendenza, ecc

Quindi, qual è uno scenario di applicazione del mondo reale in cui l'utilizzo del tipo dinamico è appropriato?

+2

See: http://stackoverflow.com/questions/253460/what-is- the-pratico-use-of-dynamic-variable-in-c-4-0 –

+5

Oltre agli oggetti COM, sono abbastanza fermamente convinto che in realtà non siano particolarmente utili in C# /. NET e una soluzione migliore esiste quasi sempre ... – Noldorin

+3

Oh, e si interpone con linguaggi dinamici come IronPython, ovviamente. È puro C#, ma non ha posto. – Noldorin

risposta

62

ci sono molti casi in cui si è già utilizzando la tipizzazione dinamica e dinamica vincolante oggi. Semplicemente non te ne rendi conto, perché è tutto nascosto dietro stringhe o System.Object, dal momento che fino al C# 4, il supporto necessario non c'era.

Un esempio è l'interoperabilità COM: COM è in realtà un sistema a oggetti semi-dinamico. Quando si esegue l'interoperabilità COM, molti metodi restituiscono effettivamente un oggetto dinamico, ma poiché C# non li supporta, sono stati restituiti come System.Object e si è dovuto eseguire il cast da soli, con la possibilità di rilevare eccezioni lungo il percorso.

Un altro esempio è l'interazione con dati digitati dinamicamente (o anche non tipizzati), come JSON, CSV, HTML, XML di schemi, servizi Web di schemi, database di schemi (che sono, dopo tutto, la nuova hotness). Oggi usi le stringhe per quelli.Un'API XML sarebbe simile a

var doc = new XmlDocument("/path/to/file.xml"); 
var baz = doc.GetElement("foo").GetElement("qux"); 

e così via. Ma come circa:

dynamic doc = new XmlDocument("/path/to/file.xml"); 
var baz = doc.foo.qux; 

Non che un aspetto gradevole?

Un terzo esempio è la riflessione. Oggi, l'invocazione di un metodo tramite riflessione viene effettuata passando una stringa a InvokeMember (o qualunque cosa venga chiamata la cosa). Non sarebbe più bello, sai, invocare solo quella dannata cosa?

Quindi, c'è generazione di dati dinamici (sostanzialmente l'opposto del secondo esempio). Ecco un esempio di come generare un po 'di XML dinamica:

dynamic doc = new XmlBuilder(); 
doc.articles(id=42, type="List",() => { 
    article(() => { 
    number(42); 
    title("blahblubb");});}); 

Questo non è così bello come il Rubino equivalente, ma è il meglio che ho potuto venire con un preavviso così breve :-)

E ultimo ma certamente non meno importante, l'integrazione con un linguaggio tipizzato dinamicamente. Che si tratti di JavaScript in un'applicazione Silverlight, un motore di regole personalizzate incorporato nell'app aziendale o un'istanza DLR ospitata nel programma CAD/IDE/editor di testo.

+1

Hmm ... interessante ma non riesco a far funzionare questi esempi in C# 4.0. Sto facendo qualcosa di sbagliato? – devuxer

+0

@DanM: per far sì che questi esempi ipotetici funzionino, dovrai ovviamente implementare le API ipotetiche, ovvero devi scrivere * classi * 'XmlDocument' e' XmlBuilder' che supportano questa API. Quest'ultimo dovrebbe essere abbastanza ovvio, penso. –

+0

Ah, vedo ora. (Ciò che mi ha confuso è che 'XmlDocument' è già una classe nel framework .NET.) – devuxer

3

C'è un esempio su MSDN:

Molti metodi COM consentono di variazione di tipi di argomento e tipo di ritorno designando i tipi come oggetto. Ciò ha richiesto il cast esplicito dei valori per coordinarsi con variabili fortemente tipizzate in C#. Se si compila usando l'opzione/link (Opzioni del compilatore C#), l'introduzione del tipo dinamico consente di trattare le occorrenze dell'oggetto nelle firme COM come se fossero di tipo dinamico, e quindi di evitare gran parte del cast.

Un altro esempio è se si deve eseguire l'interpolazione con le lingue dinamiche.

Inoltre ci sono alcune occasioni in cui si desidera creare codice un po 'generico ma non è possibile perché anche se gli oggetti implementano lo stesso metodo, non condividono una classe di base o un'interfaccia idonea che dichiari i metodi necessari. Un esempio di questo sta cercando di fare qualcosa di generico con ints e short. È un po 'un trucco, ma la dinamica ti consente di chiamare gli stessi metodi su questi diversi tipi, consentendo un maggiore riutilizzo del codice.

Aggiornamento: un po 'di ricerca qui ha trovato this related post.

1

Ho letto un interessante articolo su questo (allegato) di Scott Hanselman. Egli sottolinea che, invece di usare l'oggetto, è possibile utilizzare i metodi di riferimento dinamici da vecchi oggetti COM in cui il compilatore non sa che esiste un metodo. Ho trovato il collegamento utile.

Scott Hanselman - C#4 and the dynamic keyword

2

Penso che altri abbiano dato grandi risposte finora, quindi voglio solo aggiungere questo esempio di David Hanson. Il post di Hist mostra l'applicazione più pratica che ho trovato finora per i tipi dinamici in C# in cui li usa per creare oggetti proxy. In questo esempio crea un proxy che consente di generare eccezioni sugli errori di binding di WPF. Non sono sicuro se questo potrebbe essere ottenuto anche nel caso di associazioni WPF usando CustomTypeDescriptors e concetti descrittivi di proprietà in generale, ma a prescindere penso che l'uso del nuovo tipo dinamico C# 4.0 sia una grande dimostrazione delle sue capacità.

Raising binding exceptions in WPF & Silverlight with .net 4.0 Dynamics

metodi

Un altro uso che posso pensare per tipi dinamici è quello di creare proxy che simile può essere collegato come un DataContext in WPF o in altri luoghi dove è previsto un tipo di oggetto generico e riflessione sono normalmente usato per interrogare il tipo. In questi casi, in particolare durante la creazione di test, è possibile utilizzare un tipo dinamico che consente quindi di richiamare e registrare gli accessor delle proprietà in modo dinamico dall'oggetto proxy in modo dinamico senza dover ricorrere alle proprietà dell'hardcode all'interno di una classe di soli test.

Problemi correlati