2009-05-31 5 views
20

Obecnie badam 2. wydanie C# w głębokości i próbuję zaimplementować "dynamiczne bufory protokołu" - tj. Poziom dynamicznej obsługi nad istniejącą biblioteką buforów protokołów. Jako taki, mam typ DlrMessage pochodzący z DynamicObject. Po odrobinie zabawy udało mi się uzyskać odpowiedź na proste właściwości za pomocą zadziwiająco małego kodu, ale chcę pójść o wiele dalej - i naprawdę zrozumieć, co się dzieje.Jakie jest najlepsze źródło informacji na temat DLR (.NET 4.0 beta 1)?

Do tej pory nie znalazłem żadnych dobrych wyjaśnień DLR - a wiele postów na blogu jest obecnie nieaktualnych, ponieważ rzeczy zmieniły się (jak sądzę) między poprzednim CTP a .NET 4.0 beta 1 .. MSDN documentation for DynamicObject jest w tej chwili dość minimalna.

Moje najbardziej bezpośrednie zapytanie dotyczy tego, czy istnieje prosty sposób na powiedzenie: "Użyj odbicia, aby powiązać wszystkie połączenia, z którymi nie mogę sobie poradzić, używając tego konkretnego obiektu". (Innymi słowy, jeśli to możliwe, chcę wzmocnić istniejące wiązanie odbicia, a nie robić wszystkiego samemu.) Niestety nie jestem zbyt daleko w zgadywaniu.

Czy są jakieś ostateczne i najnowsze źródła dokumentacji, o których powinienem wiedzieć? Zdaję sobie sprawę, że część pisząc o nowej technologii jest poszukiwania, ale pomocną dłoń byłoby mile widziane :)

+5

Zobacz i tutaj myślałem, że masz na myśli Docklands Light Railway. :) – cletus

+10

Zamknięcie żartu cletusa jako duplikatu: http://stackoverflow.com/questions/655194/how-does-the-dlr-work;) –

Odpowiedz

23

najlepszym źródłem Znalazłem i czytać często jest ostatnie lata warto wypowiedzi Chrisa nory dotyczących his blog .

Istnieje również official DLR documentation page, który jest wyłączony z main DLR site.

+1

Ooh, wygląda na bardzo przydatny, dzięki - szczególnie podoba mi się to, że jest wszystkie najnowsze :) "Wstęp autora do biblioteki" wygląda tak, jakby to był dokładnie to, co trzeba. –

+36

Cóż, TO było twoje pytanie. "... najnowsze źródła dokumentacji ..." :) Czy istnieje odznaka za odpowiedzią zaakceptowaną przez Jona Skeeta? – TheSoftwareJedi

5

Ja również badam to w tej chwili i nie ma jeszcze zbyt wiele informacji. Nie mogę pomóc w zapytaniu, ale poniżej znajduje się kilka informacji, które znalazłem:

W filmach PDC jest spora kwota.

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

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

Ten artykuł mówi o tym, jak DLR współpracuje z IronPython: http://msdn.microsoft.com/en-us/magazine/cc163344.aspx

Istnieje bardzo niewielka ilość w Training Kit podglądu na: http://www.microsoft.com/downloads/details.aspx?FamilyID=752cb725-969b-4732-a383-ed5740f02e93&displayLang=en

Nadzieja pomaga to

Alex

3

Domyślnie DynamicObject powie "powrót do odbicia", jeśli twoje funkcje Try * zwrócą fałsz. Więc możesz już dziedziczyć i dodawać właściwości/pola/metody do swojej podklasy, która będzie obsługiwana przez odbicie, jeśli dynamiczna ścieżka nie sprawdza.

Dokładniej zaglądasz na IDynamicMetaObjectProvider. Na tym niższym poziomie sposób, w jaki mówisz, że powracasz do refleksji, to wywołanie metody Fallback * w przychodzącym DynamicMetaObjetBinder. To pozwala językowi wywołującemu dostarczyć rozdzielczość. Możesz następnie zwrócić tę AST lub skomponować ją do większej AST, którą zwrócisz. Zasadniczo Fallback * pozwala uzyskać AST, który wywołałby język wywołania, w tym poprawny błąd (wyjątek, niezdefiniowany w JS, itd.).

Sposób, w jaki DynamicObject powraca do refleksji, polega na tym, że wywołuje on dwukrotnie metodę fallback *.Za pierwszym razem spada z powrotem bez parametru "errorSuggestion". Otrzymuje to błąd lub AST, który został zbudowany przy użyciu refleksji. Następnie wytwarza AST, który jest czymś w rodzaju:

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

Następnie bierze to w połączeniu AST i faktycznie wręcza go jako sugestię błędu dla lepiszcza na 2 awaryjnej. Segregator powinien wówczas przestrzegać tego błędu, jeśli powiązanie nie powiedzie się. Ale jeśli obecny jest element .NET, to funkcja errorSuggestion jest odrzucana, a powiązanie .NET ma pierwszeństwo. I na koniec, jeśli język nie wie, czy powiązanie zakończyło się powodzeniem (np. W języku występuje funkcja typu "brakująca metoda"), może ponownie połączyć testy dynamiczne AST w/it. Używając Fallback, możesz nie tylko powiedzieć "do refleksji", ale także wybrać pierwszeństwo członów dynamicznych lub statycznych.

+1

Dzięki. Problem z DynamicObject polega na tym, że wraca on do refleksji nad * tym * obiektem - chciałbym, aby powrócił do refleksji nad * innym * obiektem, i podejrzewam, że do tego zadziałałbym, musiałbym zaimplementować IDynamicMetaObjectProvider, który jest więcej kłopotów niż w tym przypadku wartych. Skończyło się na kopiowaniu ładunku metod do mojego dynamicznego typu, który po prostu pośredniczył w stosunku do drugiego obiektu, a więc nadal korzystam z refleksji. Brzydki, ale działa. –

+1

@Jon Skeet Napiszesz prosty plik T4, aby kodegen ten wzorzec adaptera dla dowolnego obiektu był dość łatwy w obrębie klasy częściowej. Jeśli zadasz takie pytanie, opublikuję dla ciebie rozwiązanie! – TheSoftwareJedi

Powiązane problemy