Skip to: Site menu | Main content

Autor

Chłopak z Bałut (Dołów), po uniwerku i stypendium. Wiecznie zestresowane, przemądrzałe bezguście. Więcej na stronie domowej.

.NET Reflection c.d.

Klepanie

Wpadłem dziś na genialny(?) pomysł rozwiązania mojego wczorajszego problemu z builderami. Postanowiłem zaimplementować alternatywny TypeBuilder, który dziedziczy z Type (TypeBuilder jest sealed), a w środku trzyma sobie prawdziwego TypeBuildera i przekazuje mu wszystkie wywołania.

Zmarnowałem na tym około 2 godzin, żeby się zorientować, że część przeciążanych metod jest protected, więc nie da się ich przerzucić na TypeBuildera, a wypełnione być muszą, bo są wywoływane przez metody zaimplementowane w Type.... masakra.

Ostatecznie stwierdziłem, że opakowanie tego gówna jest najprostszym rozwiązaniem. Ale - jak to przy pakowaniu gówna - opakowanie jest niezbyt eleganckie od środka.

Do tej pory podziwiałem Microsoft za ich API. Przygotowane do najdrobniejszego szczegółu, super udokumentowane... zawiodłem się.

31 sierpnia 2006, 19:19:43 Dodaj komentarz

Pytanie o Reflection

Klepanie

Ktoś w ekipie układającej API dotnetowego reflection wpadł na bardzo fajny pomysł, żeby wszystkie XBuildery dziedziczyły po odpowiadających im typach X. I tak TypeBuilder dziedziczy po Type, AssemblyBuilder dziedziczy po Assembly, MethodBuilder dziedziczy po MethodInfo itd. Sprytne, nie?

Zauroczony programista siada zatem i pisze... zakładając że skoro inżynierowie Microsoftu tak ładnie to zaprojektowali, to równie ładnie to zaimplementowali. Wszystko sobie fajnie zaplanował, ułożył struktury danych itd... aż do momentu, kiedy po raz pierwszy uruchomi swój program.

Oto nagle okazuje się, że próba wywołania metody GetMethods na obiekcie klasy Type zwraca metody reprezentowanego przez niego typu, ale ta sama metoda wywołana na obiekcie typu TypeBuilder zgłasza wyjątek NotSupportedException. WTF? - ja się pytam. Jak mam to rozumieć? Nie umieliśmy tego zaimplementować? Nie chciało nam się tego zaimplementować? Czy ktoś mi może wytłumaczyć skąd takie zachowanie? Dlaczego muszę sam implementować coś, co (według MSDNu) mam w bibliotece? Dlaczego dokumentacja milczy na ten temat?

30 sierpnia 2006, 21:20:13 Dodaj komentarz