Domanda

Per implementare " metodo mancante " -semantics e simili in C # 4.0, devi implementare IDynamicObject:

public interface IDynamicObject
{
  MetaObject GetMetaObject(Expression parameter);
}

Per quanto ne so, IDynamicObject fa effettivamente parte del DLR, quindi non è nuovo. Ma non sono stato in grado di trovare molta documentazione su di esso.

Esistono alcune implementazioni di esempio molto semplici (fx qui e qui ), ma qualcuno potrebbe indicarmi implementazioni più complete o della documentazione reale?

In particolare, come dovresti gestire esattamente il parametro " parametro &

?

È stato utile?

Soluzione

La risposta breve è che MetaObject è responsabile della generazione effettiva del codice che verrà eseguito nel sito di chiamata. Il meccanismo che utilizza per questo sono gli alberi delle espressioni LINQ, che sono stati migliorati nel DLR. Quindi, invece di iniziare con un oggetto, inizia con un'espressione che rappresenta l'oggetto e alla fine dovrà restituire un albero di espressioni che descrive l'azione da eseguire.

Quando giochi con questo, ricorda che la versione di System.Core nel CTP è stata presa da un'istantanea alla fine di agosto. Non corrisponde in modo molto chiaro a nessuna beta particolare di IronPython. Da allora sono state apportate alcune modifiche al DLR.

Inoltre, per compatibilità con CLR v2 System.Core, le versioni di IronPython che iniziano con beta 4 o beta 5 ora rinominano tutto ciò che si trova nello spazio dei nomi di sistema in modo che si trovi nello spazio dei nomi Microsoft.

Altri suggerimenti

Se si desidera un campione end-to-end che includa il codice sorgente, risultante in un oggetto dinamico che memorizza il valore per proprietà arbitrarie in un dizionario, il mio post " A first guarda Duck Typing in C # 4.0 " potrebbe fare al caso tuo. Ho scritto quel post per mostrare come l'oggetto dinamico può essere lanciato su interfacce tipicamente statiche. Ha una completa implementazione funzionante di un Duck che è un oggetto IDynamic e può agire come un IQuack.

Se hai bisogno di ulteriori informazioni contattami sul mio blog e ti aiuterò, per quanto posso.

Ecco cosa ho capito finora:

Dynamic Language Runtime è attualmente gestito come parte del progetto IronPython . Questo è il posto migliore dove andare per informazioni.

Il modo più semplice per implementare una classe che supporta IDynamicObject sembra derivare da Microsoft.Scripting.Actions.Dynamic e sovrascrive i metodi pertinenti, ad esempio il metodo Call per implementare la semantica della chiamata di funzione. Sembra che Microsoft.Scripting.Actions.Dynamic non sia stato incluso nel CTP, ma quello di IronPython 2.0 sembra che funzionerà.

Non sono ancora chiaro il significato esatto del parametro "parametro", ma sembra fornire un contesto per l'associazione dell'oggetto dinamico.

Questa presentazione fornisce anche molte informazioni sul DLR:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top