2008-10-29 10 views
6

Aby wdrożyć „metoda-missing” -semantics i takie w C# 4.0, trzeba wdrożyć IDynamicObject:Jak zaimplementować interfejs IDynamicObject C# 4?

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

O ile mogę wymyślić IDynamicObject jest faktycznie częścią DLR, więc to nie jest nowy . Ale nie byłem w stanie znaleźć wiele dokumentacji na ten temat.

Istnieje kilka bardzo prostych przykładowych implementacji (np. here i here), ale czy ktoś mógłby wskazać mi bardziej kompletne implementacje lub jakąś prawdziwą dokumentację?

W szczególności, jak dokładnie mamy obsłużyć parametr "parametr"?

Odpowiedz

4

Krótka odpowiedź brzmi, że MetaObject jest odpowiedzialny za faktyczne wygenerowanie kodu, który będzie uruchamiany w witrynie połączenia. Mechanizm, który używa do tego drzewa wyrażeń LINQ, które zostały ulepszone w DLR. Zamiast zaczynać od obiektu, zaczyna się od wyrażenia, które reprezentuje obiekt, i ostatecznie będzie musiał zwrócić drzewo wyrażeń, które opisuje akcję, która ma zostać wykonana.

Podczas gry należy pamiętać, że wersja System.Core w CTP została pobrana z migawki pod koniec sierpnia. Nie odpowiada to bardzo konkretnie konkretnej wersji beta IronPython. Od tego czasu wiele zmian zostało wprowadzonych do DLR.

Ponadto, w celu zapewnienia kompatybilności z CLR v2 System.Core, wydania IronPython począwszy od wersji beta 4 lub beta 5 zmieniają teraz wszystko w obszarze nazw System, aby znajdowały się w przestrzeni nazw Microsoft.

0

Oto co zorientowali się do tej pory:

dynamicznego Language Runtime jest obecnie utrzymywane jako część IronPython project. To najlepsze miejsce, w którym można uzyskać informacje.

Najprostszym sposobem implementacji klasy obsługującej IDynamicObject wydaje się być wyprowadzenie z Microsoft.Scripting.Actions.Dynamic i nadpisanie odpowiednich metod, na przykład metoda wywołania w celu implementacji semantyki wywołania funkcji. Wygląda na to, że Microsoft.Scripting.Actions.Dynamic nie został włączony do CTP, ale ten z IronPython 2.0 wygląda na to, że zadziała.

Nadal nie mam jasności co do dokładnego znaczenia parametru "parametr", ale wydaje się, że zapewnia on kontekst dla wiązania obiektu dynamicznego.

3

jeśli chcesz końca do końca próbki wraz z kodem źródłowym, w wyniku dynamicznego obiektu, który przechowuje wartości dla dowolnych właściwościach w słowniku następnie my post "A first look at Duck Typing in C# 4.0" może być właśnie dla Ciebie. Napisałem ten post, aby pokazać, jak dynamiczny obiekt może być rzutowany na statycznie wpisane interfejsy. Ma kompletną działającą implementację kaczki, która jest IDynamicObject i może zachowywać się jak IQuack.

Jeśli potrzebujesz więcej informacji, skontaktuj się ze mną na moim blogu, a pomogę ci, tak dobrze jak potrafię.

Powiązane problemy