2009-05-31 11 views
20

Attualmente sto ricercando la seconda edizione di C# in Profondità e sto cercando di implementare "buffer di protocollo dinamici", ovvero un livello di supporto dinamico sulla mia libreria di buffer del protocollo esistente. Come tale, ho un tipo DlrMessage derivato da DynamicObject. Dopo un po 'di gioco sono riuscito a farlo rispondere a proprietà semplici con un codice notevolmente piccolo, ma voglio andare molto oltre - e capire davvero cosa sta succedendo.Qual è la migliore fonte di informazioni sul DLR (.NET 4.0 beta 1)?

Finora non ho trovato alcuna buona spiegazione del DLR - e molti post del blog sono effettivamente obsoleti ora, poiché le cose sono cambiate (credo) tra il precedente CTP e .NET 4.0 beta 1 Il MSDN documentation for DynamicObject al momento è piuttosto minimale.

La mia query più immediata è se esiste un modo semplice per dire "Usa la riflessione per associare le chiamate che non riesco a gestire, utilizzando questo particolare oggetto". (In altre parole, voglio aumentare il legame di riflessione esistente piuttosto che fare tutto da solo, se possibile.) Sfortunatamente non sto andando molto lontano dalle supposizioni.

Esistono fonti di documentazione definitiva e recente che dovrei conoscere? Sono consapevole del fatto che parte di scrivere di una nuova tecnologia è esplorazione, ma una mano sarebbe apprezzato :)

+5

Vedi e qui pensavo che intendessi la Docklands Light Railway. :) – cletus

+10

Chiudere la battuta del cletus come duplicato: http://stackoverflow.com/questions/655194/how-does-the-dlr-work;) –

risposta

23

migliore fonte che ho trovato e leggo spesso è negli ultimi anni vale la pena di tutti i messaggi di Chris Burrow su his blog .

C'è anche lo official DLR documentation page che si trova fuori dallo main DLR site.

+1

Ooh, sembra molto utile, grazie - Mi piace particolarmente il fatto che sia tutti recenti :) "L'introduzione dell'autore della biblioteca" sembra essere esattamente la cosa giusta. –

+36

Beh, questa è stata la tua domanda. "... fonti recenti di documentazione ..." :) C'è un badge per avere una risposta accettata da Jon Skeet? – TheSoftwareJedi

5

Anche io sto facendo ricerche su questo momento e non ci sono ancora molte informazioni. Non posso aiutarti con la tua domanda, ma di seguito sono riportate alcune informazioni che ho trovato:

C'è una quantità equa all'interno dei video PDC.

http://channel9.msdn.com/pdc2008/TL44/

http://channel9.msdn.com/pdc2008/TL10/

Questo articolo parla di come la DLR lavora con IronPython: http://msdn.microsoft.com/en-us/magazine/cc163344.aspx

C'è una quantità molto piccola nel kit di formazione Anteprima: http://www.microsoft.com/downloads/details.aspx?FamilyID=752cb725-969b-4732-a383-ed5740f02e93&displayLang=en

Speranza questo aiuta

Alex

3

Per impostazione predefinita, DynamicObject dirà "Fallback to reflection" se le funzioni Try * restituiscono false. Quindi puoi già ereditare e aggiungere proprietà/campi/metodi alla sottoclasse che verranno gestiti dalla riflessione se il percorso dinamico non esegue la ricerca.

Andando più in profondità potresti voler dare un'occhiata a IDynamicMetaObjectProvider. A questo livello più basso il modo in cui si dice il fallback al reflection è di chiamare il metodo Fallback * sul DynamicMetaObjetBinder in arrivo. Ciò consente quindi alla lingua di chiamata di fornire la risoluzione. È quindi possibile restituire AST o comporlo in un AST più grande a cui si restituisce. Fondamentalmente Fallback * consente di ottenere l'AST che la lingua chiamante produrrebbe includendo l'errore corretto (eccezione, indefinito in JS, ecc ...).

Il modo in cui DynamicObject esegue il fallback per la riflessione è che in realtà richiama il metodo di fallback * del raccoglitore due volte.La prima volta che ritorna indietro senza un parametro "errorSuggestion". Questo ottiene l'errore o l'AST che è stato creato usando il reflection. Si produce quindi un AST, che è qualcosa di simile:

if(TryGetMember("name", out value)) { 
    return value; 
} else { 
    return resultOffallback; 
} 

Ci vuole allora questo AST combinato e in realtà lo passa come il suggerimento di errore per il legante su un 2 ° fallback. Il raccoglitore dovrebbe quindi rispettare questo errore suggerimento se l'associazione non ha successo. Ma se il membro .NET è presente, errorSuggestion viene gettato via e l'associazione .NET ha la precedenza. Infine, se la lingua non sa se l'associazione ha avuto successo (ad esempio la lingua ha una caratteristica di tipo "metodo mancante"), può ancora combinare gli AST con i controlli dinamici. Quindi, usando Fallback non puoi solo dire di fare riflessioni, ma puoi anche decidere se i membri dinamici o statici hanno la precedenza.

+1

Grazie. Il problema con DynamicObject è che ricade sulla riflessione su * questo * oggetto - Mi piacerebbe che tornasse alla riflessione su un oggetto * diverso *, e sospetto che per farlo funzionare dovrei implementare IDynamicMetaObjectProvider, che è più problemi di quanti ne valga la pena in questo caso. Ho finito per copiare un carico di metodi nel mio tipo dinamico che si limita a proxy sull'altro oggetto, quindi ho ancora il beneficio della riflessione. Brutto, ma funziona. –

+1

@Jon Skeet Si scrive un semplice file T4 per codeggere questo modello di adattatore per qualsiasi oggetto abbastanza facilmente all'interno di una classe parziale. Se fai una domanda del genere, pubblicherò una soluzione per te! – TheSoftwareJedi

Problemi correlati