<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4948373727924568605</id><updated>2011-04-22T03:47:43.364+02:00</updated><category term='c#'/><category term='atrybuty'/><category term='refleksja'/><category term='LINQ'/><category term='muzyka'/><category term='wideo'/><category term='foreach'/><category term='Enterprise Library'/><category term='ja'/><category term='offtopic'/><category term='.NET'/><category term='architektura'/><category term='ogólne'/><title type='text'>dot or not</title><subtitle type='html'>.NET + C# + radosna twórczość + brak umiejętności literackich</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jakubbinkowski.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4948373727924568605/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jakubbinkowski.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jakub Binkowski</name><uri>http://www.blogger.com/profile/05048099728719798482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_IZ8HWihKFms/SCNVqy3JlGI/AAAAAAAAASg/uIV7g2qYJnM/S220/jbinkowski.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4948373727924568605.post-4605394632134035652</id><published>2008-06-09T22:53:00.001+02:00</published><updated>2008-06-09T22:53:52.966+02:00</updated><title type='text'>Przeniesienie bloga</title><content type='html'>&lt;p&gt;Niniejszym obwieszczam wszystkim tego bloga czytającym (o ile są takowi), że tutaj już więcej niczego nie napiszę. Bo tak i już :). Przeniosłem się na serwis &lt;a href="http://www.zine.net.pl"&gt;www.zine.net.pl&lt;/a&gt; - a dokładnie pod adres &lt;a href="http://www.zine.net.pl/blogs/jakubin"&gt;www.zine.net.pl/blogs/jakubin&lt;/a&gt;. See you there!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4948373727924568605-4605394632134035652?l=jakubbinkowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubbinkowski.blogspot.com/feeds/4605394632134035652/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4948373727924568605&amp;postID=4605394632134035652' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4948373727924568605/posts/default/4605394632134035652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4948373727924568605/posts/default/4605394632134035652'/><link rel='alternate' type='text/html' href='http://jakubbinkowski.blogspot.com/2008/06/przeniesienie-bloga.html' title='Przeniesienie bloga'/><author><name>Jakub Binkowski</name><uri>http://www.blogger.com/profile/05048099728719798482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_IZ8HWihKFms/SCNVqy3JlGI/AAAAAAAAASg/uIV7g2qYJnM/S220/jbinkowski.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4948373727924568605.post-9117925785458283037</id><published>2008-05-31T17:52:00.001+02:00</published><updated>2008-05-31T17:53:51.672+02:00</updated><title type='text'>PostSharp 1.0 RC3 wydany</title><content type='html'>&lt;p&gt;Postsharp to bardzo ciekawy framework (biblioteka, mechanizm?) pozwalający zrealizować programowanie aspektowe (AOP) w .NET. Jako, że jeden przykład wart jest tysiąca sł&amp;#243;w - oto przykładowy aspekt pozwalający wywołać metodę w transakcji (opakować wywołanie metody za pomocą TransactionScope):&lt;/p&gt;  &lt;pre class="code"&gt;[&lt;span style="color: #2b91af"&gt;Serializable&lt;/span&gt;]&lt;br /&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TransactionScopeAttribute&lt;/span&gt;: &lt;span style="color: #2b91af"&gt;OnMethodInvocationAspect&lt;br /&gt;&lt;/span&gt;{&lt;br /&gt;    &lt;span style="color: blue"&gt;public override void &lt;/span&gt;OnInvocation(&lt;span style="color: #2b91af"&gt;MethodInvocationEventArgs &lt;/span&gt;eventArgs)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: blue"&gt;using &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;ts = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TransactionScope&lt;/span&gt;())&lt;br /&gt;        {&lt;br /&gt;            eventArgs.Proceed();&lt;br /&gt;            ts.Complete();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;Oraz jego zastosowanie w praktyce:&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Program&lt;br /&gt;&lt;/span&gt;{&lt;br /&gt;    &lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;    {&lt;br /&gt;        MyDbMethod();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [&lt;span style="color: #2b91af"&gt;TransactionScope&lt;/span&gt;]&lt;br /&gt;    &lt;span style="color: blue"&gt;private static void &lt;/span&gt;MyDbMethod()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: green"&gt;//...&lt;br /&gt;    &lt;/span&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Jego największą przewagą nad innymi rozwiązaniami (&lt;a href="http://msdn.microsoft.com/pl-pl/library/cc511729(en-us).aspx"&gt;Policy Injection Application Block&lt;/a&gt;, &lt;a href="http://www.springframework.net/doc/reference/html/aop-quickstart.html"&gt;AOP w Spring.net&lt;/a&gt;, itp.) jest fakt, że pozwala przechwycić praktycznie każdą metodę - nie wymaga, aby klasa implementowała interfejs, czy też dziedziczyła po MarshalByRefObject. Co więcej, umożliwia przechwytywanie wywołań konstruktor&amp;#243;w, metod statycznych, prywatnych, itp. Tak szerokie możliwości wynikają z odmiennego mechanizmu działania. PostSharp &lt;strong&gt;po wygenerowaniu assembly&lt;/strong&gt; modyfikuje kod IL wszystkich przechwytywanych metod, tak aby umożliwić przechwycenie wywołania.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Warto zaznaczyć, że framework jest darmowy i ma otwarty kod źr&amp;#243;dłowy (na licencji GPL/LGPL v3). &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Wiecej informacji na &lt;a href="http://www.postsharp.org/"&gt;stronie projektu&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;PS. Zgodnie z informacją na &lt;a href="http://www.postsharp.org/blog/2008/05/postsharp-present-at-codecamp-krakow.html"&gt;blogu&lt;/a&gt;, PostSharp będzie prezentowany na CodeCamp 7 czerwca w Krakowie. Uważam, że tej prezentacji nie można przegapić!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4948373727924568605-9117925785458283037?l=jakubbinkowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubbinkowski.blogspot.com/feeds/9117925785458283037/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4948373727924568605&amp;postID=9117925785458283037' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4948373727924568605/posts/default/9117925785458283037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4948373727924568605/posts/default/9117925785458283037'/><link rel='alternate' type='text/html' href='http://jakubbinkowski.blogspot.com/2008/05/postsharp-10-rc3-wydany.html' title='PostSharp 1.0 RC3 wydany'/><author><name>Jakub Binkowski</name><uri>http://www.blogger.com/profile/05048099728719798482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_IZ8HWihKFms/SCNVqy3JlGI/AAAAAAAAASg/uIV7g2qYJnM/S220/jbinkowski.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4948373727924568605.post-7955316171702482238</id><published>2008-05-19T19:26:00.001+02:00</published><updated>2008-05-19T19:28:00.081+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='architektura'/><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Library'/><title type='text'>Finalny Enterprise Library 4.0</title><content type='html'>&lt;p&gt;Już od 4 dni dostępne jest finalne wydanie Enterprise Library 4.0. Bibliotekę można pobrać ze &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=90DE37E0-7B42-4044-99BE-F8ECFBBC5B65&amp;amp;displaylang=en"&gt;strony&lt;/a&gt; (wymaga rejestracji), dokumentacja dostępna jest na &lt;a href="http://msdn.microsoft.com/en-us/library/cc512464.aspx"&gt;MSDN&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Nowości względem wersji 3.1:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Nowy blok - &lt;strong&gt;Unity Application Block&lt;/strong&gt;. Jest to lekka i rozszerzalna implementacja kontenera Dependency Injection.&lt;/li&gt;    &lt;li&gt;Wszystkie assembly są oznaczone jako &lt;strong&gt;Allow Partially-Trusted Callers&lt;/strong&gt; (APTCA), dzięki czemu Enterprise Library może być wykorzystywany przez kod &amp;quot;częściowo zaufany&amp;quot;. Jest to bardzo przydatne w środowiskach hostowanych - aktualnie można bezpośrednio wykorzystać dostarczone podpisane assembly bez konieczności własnej rekompilacji.&lt;/li&gt;    &lt;li&gt;W Policy Injection Application Blok wszystkie CallHandlers mają nowy atrybut &lt;strong&gt;Order&lt;/strong&gt; (typu int), kt&amp;#243;ry określa kolejność, w jakiej mają być nakładane polisy. Jest to bardzo przydatna zmiana, gdyż dzięki niej można na przykład zarządać, aby autoryzacja dostępu do metody odbyła się przed walidacją jej parametr&amp;#243;w.&lt;/li&gt;    &lt;li&gt;Przy używaliu ValidationCallHandler mamy możliwość określenia nazw zestaw&amp;#243;w reguł (RuleSet), jakie mają zostać użyte do walidacji parametr&amp;#243;w.&lt;/li&gt;    &lt;li&gt;Wsparcie dla &lt;strong&gt;WMI 2.0&lt;/strong&gt; i poprawiona instrumentacja.&lt;/li&gt;    &lt;li&gt;Możliwość wpięcia własnego CacheManagera (poprzez interfejs ICacheManager)&lt;/li&gt;    &lt;li&gt;Zmiany w Logging Application Block.&lt;/li&gt;    &lt;li&gt;Inne (poprawki błęd&amp;#243;w, poprawki wydajności, nowe liczniki wydajności)&lt;/li&gt;    &lt;li&gt;Wsparcie dla &lt;strong&gt;.NET 3.5 i VS 2008&lt;/strong&gt;.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Ostatni punkt jest właściwie zaletą i wadą jednocześnie, gdyż &lt;strong&gt;wymagany jest .NET 3.5&lt;/strong&gt;. Dla projekt&amp;#243;w tworzonych dla .NET 2.0 i 3.0 pozostaje EntLib 3.1. Pocieszeniem jest fakt, że Unity można &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=6A9E363C-8E0A-48D3-BBE4-C2F36423E2DF&amp;amp;displaylang=en"&gt;pobrać oddzielnie&lt;/a&gt; i wymaga on już tylko .NET 2.0 lub nowszego. &lt;/p&gt;  &lt;p&gt;W najbliższym czasie mam zamiar przyjrzeć się Unity oraz opisać moje dotychczasowe doświadczenia z Policy Injection (kt&amp;#243;ry moim skromnym zdaniem nadał nowy sens całemu Enterprise Library).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4948373727924568605-7955316171702482238?l=jakubbinkowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubbinkowski.blogspot.com/feeds/7955316171702482238/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4948373727924568605&amp;postID=7955316171702482238' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4948373727924568605/posts/default/7955316171702482238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4948373727924568605/posts/default/7955316171702482238'/><link rel='alternate' type='text/html' href='http://jakubbinkowski.blogspot.com/2008/05/finalny-enterprise-library-40.html' title='Finalny Enterprise Library 4.0'/><author><name>Jakub Binkowski</name><uri>http://www.blogger.com/profile/05048099728719798482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_IZ8HWihKFms/SCNVqy3JlGI/AAAAAAAAASg/uIV7g2qYJnM/S220/jbinkowski.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4948373727924568605.post-7911348760518495391</id><published>2008-05-15T19:57:00.001+02:00</published><updated>2008-05-15T19:58:02.124+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>LINQPad</title><content type='html'>&lt;p&gt;Właśnie dodałem sekcję &amp;quot;Moje aktualne top 10&amp;quot;, w kt&amp;#243;rej będę umieszczał programy, strony i wszystko inne, co aktualnie wydaje mi się najbardziej ciekawe. LINQPad jest jej pierwszą (i na razie jedyną) pozycją. Napisany został przez Josepha Albarhari, autora książki &amp;quot;C# 3.0 in a Nutshell&amp;quot;.&lt;/p&gt;  &lt;p&gt;Program ten to tzw. &amp;quot;must have&amp;quot; każdego, kto ma zamiar używać technologii LINQ (to SQL, to Objects, to XML). W skr&amp;#243;cie jest to mały edytor pozwalający odpalać wyrażenia C#/VB oraz kawałki kodu. Dzięki niemu można przetestować każde wyrażenie LINQ. Wszystko m&amp;#243;wiący screen:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/jakubin/SCx46irvcpI/AAAAAAAAATo/uTlcXRyf48w/s1600-h/image%5B9%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="419" alt="image" src="http://lh4.ggpht.com/jakubin/SCx5fCrvcqI/AAAAAAAAATw/Nk3hS2mlPi8/image_thumb%5B3%5D.png?imgmax=800" width="694" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Cudo to potrafi:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;łączyć się z bazami MS SQL,&lt;/li&gt;    &lt;li&gt;wyświetlać wyniki zapytań,&lt;/li&gt;    &lt;li&gt;wyświetlać kod SQL zapytania,&lt;/li&gt;    &lt;li&gt;wyświetlać zapytanie LINQ skonwertowane do extension methods oraz wyrażeń lambda;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;zawiera 200 przykład&amp;#243;w zapytań z książki &amp;quot;C# 3.0 in a Nutshell&amp;quot; - świetny materiał do nauki LINQ.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Aplikacja jest dostępna na stronie &lt;a title="http://www.linqpad.net/" href="http://www.linqpad.net/"&gt;http://www.linqpad.net/&lt;/a&gt; i co najważniejsze jest darmowa.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4948373727924568605-7911348760518495391?l=jakubbinkowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubbinkowski.blogspot.com/feeds/7911348760518495391/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4948373727924568605&amp;postID=7911348760518495391' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4948373727924568605/posts/default/7911348760518495391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4948373727924568605/posts/default/7911348760518495391'/><link rel='alternate' type='text/html' href='http://jakubbinkowski.blogspot.com/2008/05/linqpad.html' title='LINQPad'/><author><name>Jakub Binkowski</name><uri>http://www.blogger.com/profile/05048099728719798482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_IZ8HWihKFms/SCNVqy3JlGI/AAAAAAAAASg/uIV7g2qYJnM/S220/jbinkowski.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/jakubin/SCx5fCrvcqI/AAAAAAAAATw/Nk3hS2mlPi8/s72-c/image_thumb%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4948373727924568605.post-7444187763607346027</id><published>2008-05-10T18:17:00.001+02:00</published><updated>2008-05-10T18:17:54.223+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='foreach'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>foreach - zagadka</title><content type='html'>&lt;p&gt;Proponuję prosty acz kształcący konkurs ;). Pytanie jest proste - jakie są&lt;strong&gt; trzy&lt;/strong&gt; sposoby na zdefiniowanie klasy Foo, aby poniższy kod się skompilował:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;Foo &lt;/span&gt;f = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Foo&lt;/span&gt;();&lt;br /&gt;&lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;object &lt;/span&gt;o &lt;span style="color:blue;"&gt;in &lt;/span&gt;f)&lt;br /&gt;{&lt;br /&gt;   &lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Osoba, która poda wszystkie 3 w nagrodę bedzie mogła pozdrowić znajmonych na łamach mojego bloga ;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4948373727924568605-7444187763607346027?l=jakubbinkowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubbinkowski.blogspot.com/feeds/7444187763607346027/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4948373727924568605&amp;postID=7444187763607346027' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4948373727924568605/posts/default/7444187763607346027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4948373727924568605/posts/default/7444187763607346027'/><link rel='alternate' type='text/html' href='http://jakubbinkowski.blogspot.com/2008/05/foreach-zagadka.html' title='foreach - zagadka'/><author><name>Jakub Binkowski</name><uri>http://www.blogger.com/profile/05048099728719798482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_IZ8HWihKFms/SCNVqy3JlGI/AAAAAAAAASg/uIV7g2qYJnM/S220/jbinkowski.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4948373727924568605.post-5418751505109412499</id><published>2008-05-10T01:27:00.001+02:00</published><updated>2008-05-10T01:38:12.758+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atrybuty'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='refleksja'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Powierzchowna refleksja na atrybuty, czyli CustomAttributeData w akcji</title><content type='html'>&lt;h3&gt;Fakty o klasie CustomAttributeData&lt;/h3&gt;  &lt;p&gt;Pełne informacje: oczywiście &lt;a href="http://msdn.microsoft.com/en-us/library/system.reflection.customattributedata.aspx"&gt;MSDN&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A tak konkretnie: CustomAttributeData to klasa przechowująca informacje o atrybucie opisującym typ, członka, parametr,... W odr&amp;#243;żnieniu od metody GetCustomAttributes (z Type, MemberInfo, ParameterInfo, itd.) nie tworzy ona instancji atrybut&amp;#243;w, ale daje jedynie informacje o tym: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;jakie parametry zostały przekazane do jego konstruktora,&lt;/li&gt;    &lt;li&gt;jakie nazwane parametry (w postaci Nazwa=Wartość) zostały zadeklarowane,&lt;/li&gt;    &lt;li&gt;kt&amp;#243;ry konstruktor został wywołany.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Innymi słowy - CustomAttributeData zawiera przepis, jak utworzyć instancję danego atrybutu, a np. Type.GetCustomAttributes() zwraca już utworzone atrybuty.&lt;/p&gt;  &lt;p&gt;Zgodnie z zasadą, że jeden przykład zastępuje tysiąc sł&amp;#243;w - spr&amp;#243;bujmy dowiedzieć się jakie atrybuty ma typ System.Web.UI.Page:&lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;[Designer(&lt;span style="color: #006080"&gt;&amp;quot;Microsoft.VisualStudio.Web....&amp;quot;&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(IRootDesigner))]&lt;br /&gt;[DefaultEvent(&lt;span style="color: #006080"&gt;&amp;quot;Load&amp;quot;&lt;/span&gt;)]&lt;br /&gt;[DesignerSerializer(&lt;span style="color: #006080"&gt;&amp;quot;Microsoft.VisualStudio...&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;System.ComponentModel...&amp;quot;&lt;/span&gt;)]&lt;br /&gt;[DesignerCategory(&lt;span style="color: #006080"&gt;&amp;quot;ASPXCodeBehind&amp;quot;&lt;/span&gt;)]&lt;br /&gt;[ToolboxItem(&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Page //...&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;W tym celu wywołujemy statyczną metodę GetCustomAttributes klasy CustomAttributeData:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; IList&amp;lt;CustomAttributeData&amp;gt; data = &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;     CustomAttributeData.GetCustomAttributes(&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt; (System.Web.UI.Page));&lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Następnie iterujemy przez wszystkie dane atrybut&amp;#243;w i wyświetlany uzyskane informacje:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var attributeData &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; data)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;Typ atrybutu: {0}&amp;quot;&lt;/span&gt;,attributeData.Constructor.DeclaringType.FullName);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot; Argumenty konstruktora:&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; i = 0; i &amp;lt; attributeData.ConstructorArguments.Count; i++)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;     {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;         ParameterInfo param = attributeData.Constructor.GetParameters()[i];&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt; = attributeData.ConstructorArguments[i].Value;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;         Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;  {0} = {1}&amp;quot;&lt;/span&gt;, param.Name, &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;     }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;     Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot; Nazwane argumenty:&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var arg &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; attributeData.NamedArguments)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt;     {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt;         Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;  {0} = {1}&amp;quot;&lt;/span&gt;, &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  15:&lt;/span&gt;             arg.MemberInfo.Name, &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  16:&lt;/span&gt;             arg.TypedValue.Value);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  17:&lt;/span&gt;     }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  18:&lt;/span&gt; }&lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Oto wynik działania kodu:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://lh5.ggpht.com/jakubin/SCTdzOZQ6FI/AAAAAAAAATQ/gCQLtC8ZWuU/s1600-h/custattrdata%5B10%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="344" alt="custattrdata" src="http://lh6.ggpht.com/jakubin/SCTd0eZQ6GI/AAAAAAAAATY/YRvVr_gJhzE/custattrdata_thumb%5B8%5D.png?imgmax=800" width="681" border="0" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Czyli dokładnie te informacje, kt&amp;#243;rych się spodziewaliśmy.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Wydajność&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Pomimo, że CustomAttributeData nie tworzy instancji obiekt&amp;#243;w, to koszt (czas) jego uzyskania jest znacznie większy niż w przypadku np. Type.GetCustomAttributes. Justin Rogers na swoim &lt;a href="http://weblogs.asp.net/justin_rogers/archive/2004/09/08/227175.aspx"&gt;blogu&lt;/a&gt; prezentuje własne badanie, kt&amp;#243;re wykazało r&amp;#243;żnicę około czterokrotną. Tak znaczącą koszt może wynikać chociażby z faktu, iż CustomAttributeData musi pobrać bardzo wiele metadanych (ConstructorInfo oraz PropertyInfo dla każdego nazwanego argumentu). Po dokładniejsze informacje odsyłam do wyżej wspomnianego posta.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Kiedy może się taki spos&amp;#243;b refleksji przydać?&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;1. Tryb ReflectionOnly&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Assembly, kt&amp;#243;re definiuje typ, mamy załadowane &lt;strong&gt;w trybie ReflectionOnly&lt;/strong&gt;. Przykładowo: &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; Assembly.ReflectionOnlyLoad(&lt;span style="color: #006080"&gt;&amp;quot;mscorlib&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; Type reflectionOnlyString = &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     Type.ReflectionOnlyGetType(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;).AssemblyQualifiedName, &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;W takiej sytuacji użycie CustomAttributeData jest jedyną możliwością uzyskania informacji o atrybutach, gdyż w trybie ReflectionOnly żaden kod zdefiniowany w assembly nie może zostać uruchomiony. Metoda Type.GetCutomAttibutes() nie może zostać uruchomiona, gdyż tworzy ona instancje wszystkich atrybut&amp;#243;w.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;2. Dostęp do wszystkich informacji podanych do kontruktora atrybutu&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Zdarzają się takie sytuacje, że potrzebujemy uzyskać dostęp bezpośrednio do danych przekazanych w konstruktorze atrybutu. Niestety, nie zawsze tw&amp;#243;rcy udostępniają je jako publiczne pola/właściwości lub też są dostępne w spos&amp;#243;b pośredni. Prosty przykład - rozważmy przykład atrybutu, kt&amp;#243;rego zadaniem jest walidacja czy właściwość, kt&amp;#243;rą opisuje, nie jest nullem lub pustym stringiem (taka mikro wersja Validation Application Block):&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; NotNullOrEmptyAttribute: Attribute&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; ErrorMessage { get; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; set; }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; _negated;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; NotNullOrEmptyAttribute(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; fieldName, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; negated)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;     {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;         ErrorMessage = String.Format(&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;             &lt;span style="color: #006080"&gt;&amp;quot;Value for field {0} cannot be a null value or empty string.&amp;quot;&lt;/span&gt;, &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;             fieldName);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;         _negated = negated;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;     }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; IsValid(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  15:&lt;/span&gt;     {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  16:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; String.IsNullOrEmpty(&lt;span style="color: #0000ff"&gt;value&lt;/span&gt;) == _negated;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  17:&lt;/span&gt;     }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  18:&lt;/span&gt; }&lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Zastosowanie takiego atrybutu mogłoby wyglądać następująco:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; User&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     [NotNullOrEmpty(&lt;span style="color: #006080"&gt;&amp;quot;user name&amp;quot;&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;)]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; UserName { get; set; }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;     &lt;span style="color: #008000"&gt;//...&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt; }&lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Oczywiście w takiej sytuacji dokonanie walidacji, czy dana wartość jest poprawna dla danej właściwości, będzie dziecinnie proste. Gorzej jednak, gdy chcemy wykorzytać ten atrybut do innych cel&amp;#243;w niż przewidział tw&amp;#243;rca. Na przykład, potrzebujemy utworzyć stronę ASP.NET, kt&amp;#243;ra edytuje dane użytkownika i kt&amp;#243;ra automatycznie na podstawie atrybutu wstawia walidator RequiredFieldValidator. W&amp;#243;wczas potrzebujemy wartości podanych do kontruktora atrybutu, czyli fieldName oraz negated. Dostęp do tych danych możemy uzyskać:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;nieelegancko i w spos&amp;#243;b wrażliwy na przyszłe zmiany - &amp;quot;wydłubując&amp;quot; z ErrorMessage wartość fieldName&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;modląc się, że docelowo nasz kod będzie miał &lt;a href="http://msdn.microsoft.com/en-us/library/stfy7tfc(VS.71).aspx"&gt;odpowiednio wysokie uprawnienia&lt;/a&gt; - za pomocą refleksji odczytać prywatną wartość pola _negated (jak? polecam wpis na &lt;a href="http://www.maciejaniserowicz.com/post/2008/03/Lamiemy-prywatnosc-czyli-zalozmy-Jarkowi-konto!.aspx"&gt;blogu Maćka Aniserowicza&lt;/a&gt;)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Możemy jednak elegancko zastosować właśnie CustomAttributeData:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; IList&amp;lt;CustomAttributeData&amp;gt; data = &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;     CustomAttributeData.GetCustomAttributes(&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt; (User).GetProperty(&lt;span style="color: #006080"&gt;&amp;quot;UserName&amp;quot;&lt;/span&gt;));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt; CustomAttributeData nullOrEmptyData =&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;     data.First(d =&amp;gt; d.Constructor.DeclaringType == &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt; (NotNullOrEmptyAttribute));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; fieldName = (&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;)nullOrEmptyData.ConstructorArguments[0].Value;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; isNegated = (&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;) nullOrEmptyData.ConstructorArguments[1].Value;&lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Mała uwaga - jeżeli dodatkowo klasę User mamy załadowaną w trybie ReflectionOnly to por&amp;#243;wnanie&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;d.Constructor.DeclaringType == &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt; (NotNullOrEmptyAttribute)&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;nigdy nie zwr&amp;#243;ci true (bo w trybie ReflectionOnly typ NullOrEmptyAttribute to inny typ niż NullOrEmptyAttribute w &amp;quot;normalnym&amp;quot; trybie). W&amp;#243;wczas wyjściem jest sprawdzenie nazwy typu (najbezpieczniej razem z kwalifikowaną nazwą assembly):&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;d.Constructor.DeclaringType.AssemblyQualifiedName == &lt;br /&gt;&lt;span style="color: #006080"&gt;&amp;quot;CustomAttributeDataTest.NotNullOrEmptyAttribute, CustomAttributeDataTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4948373727924568605-5418751505109412499?l=jakubbinkowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubbinkowski.blogspot.com/feeds/5418751505109412499/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4948373727924568605&amp;postID=5418751505109412499' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4948373727924568605/posts/default/5418751505109412499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4948373727924568605/posts/default/5418751505109412499'/><link rel='alternate' type='text/html' href='http://jakubbinkowski.blogspot.com/2008/05/powierzchowna-refleksja-na-atrybuty.html' title='Powierzchowna refleksja na atrybuty, czyli CustomAttributeData w akcji'/><author><name>Jakub Binkowski</name><uri>http://www.blogger.com/profile/05048099728719798482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_IZ8HWihKFms/SCNVqy3JlGI/AAAAAAAAASg/uIV7g2qYJnM/S220/jbinkowski.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/jakubin/SCTd0eZQ6GI/AAAAAAAAATY/YRvVr_gJhzE/s72-c/custattrdata_thumb%5B8%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4948373727924568605.post-4048392245790432829</id><published>2008-05-09T00:54:00.001+02:00</published><updated>2008-05-09T22:53:52.974+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wideo'/><category scheme='http://www.blogger.com/atom/ns#' term='offtopic'/><category scheme='http://www.blogger.com/atom/ns#' term='muzyka'/><title type='text'>Na dobry początek - kolejny offtopic</title><content type='html'>&lt;p&gt;Zamiast pisać sporo o sobie postanowiłem wrzucić dwa klipy, które zawsze poprawiają mi humor (choć raczej nie narzekam na chandry wszelkiej maści).&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Pierwszy to klip "Body Movin'" od Beastie Boys (album "Hello Nasty" 1998):&lt;br /&gt;&lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:bd856ebd-d2c6-4c04-85a5-f1d9f0e69d14" style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/WcnTxcqcNEE&amp;amp;hl=en"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/WcnTxcqcNEE&amp;amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;Drugi to utwór z filmu "Autostopem przez galaktykę" ("The Hitchhiker's Guide to the Galaxy"), który jeśli chodzi o typ humoru, jest moim absolutnym faworytem:&lt;br /&gt;&lt;/li&gt;&lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:20298d7e-f16c-4892-a4e1-52e6d3058c99" style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ojydNb3Lrrs&amp;amp;hl=en"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/ojydNb3Lrrs&amp;amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4948373727924568605-4048392245790432829?l=jakubbinkowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubbinkowski.blogspot.com/feeds/4048392245790432829/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4948373727924568605&amp;postID=4048392245790432829' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4948373727924568605/posts/default/4048392245790432829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4948373727924568605/posts/default/4048392245790432829'/><link rel='alternate' type='text/html' href='http://jakubbinkowski.blogspot.com/2008/05/na-dobry-pocztek-kolejny-offtopic.html' title='Na dobry początek - kolejny offtopic'/><author><name>Jakub Binkowski</name><uri>http://www.blogger.com/profile/05048099728719798482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_IZ8HWihKFms/SCNVqy3JlGI/AAAAAAAAASg/uIV7g2qYJnM/S220/jbinkowski.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4948373727924568605.post-5256987339571509398</id><published>2008-05-09T00:32:00.001+02:00</published><updated>2008-05-09T00:32:09.580+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ogólne'/><category scheme='http://www.blogger.com/atom/ns#' term='ja'/><category scheme='http://www.blogger.com/atom/ns#' term='offtopic'/><title type='text'>O mnie, blogu i sensie wszystkiego</title><content type='html'>&lt;p&gt;Ponieważ każdy blog musi zaczynać się wpisem, w kt&amp;#243;rym autor się przedstawia i kt&amp;#243;rego nikt nie czyta, to ja nie będę gorszy. A więc trzy słowa...:&lt;/p&gt;  &lt;p&gt;Jestem:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;studentem informatyki na Politechnice Ł&amp;#243;dzkiej (właściwie to już tylko jedną nogę),&lt;/li&gt;    &lt;li&gt;programistą C#,&lt;/li&gt;    &lt;li&gt;autorem tego bloga.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Zajmuję się/zajmowałem się:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;aktualnie pracuję dla firmy Webstruments,&lt;/li&gt;    &lt;li&gt;wcześniej brałem udział w ITCore (falstart numer 1) jako architekt; tutaj nadmienię, że pomimo porażku i wątpliwej jakości efekt&amp;#243;w, to jestem dumny z tego, że miałem przyjemność uczestniczyć w tym projekcie i w tym zespole,&lt;/li&gt;    &lt;li&gt;a jeszcze wcześnie udzielałem się w projekcie CodeGuru jako programista/lider zespołu.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Chcę:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;aby ten blog był w miarę ciekawy,&lt;/li&gt;    &lt;li&gt;kiedyś wiedzieć choć połowę tego co &lt;a href="http://digger.computerworld.pl/"&gt;autor tego blogu&lt;/a&gt;.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;A co do sensu wszystkiego, to jest to oczywiście: 0x2a (zagadka dla dociekliwych).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4948373727924568605-5256987339571509398?l=jakubbinkowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubbinkowski.blogspot.com/feeds/5256987339571509398/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4948373727924568605&amp;postID=5256987339571509398' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4948373727924568605/posts/default/5256987339571509398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4948373727924568605/posts/default/5256987339571509398'/><link rel='alternate' type='text/html' href='http://jakubbinkowski.blogspot.com/2008/05/o-mnie-blogu-i-sensie-wszystkiego.html' title='O mnie, blogu i sensie wszystkiego'/><author><name>Jakub Binkowski</name><uri>http://www.blogger.com/profile/05048099728719798482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_IZ8HWihKFms/SCNVqy3JlGI/AAAAAAAAASg/uIV7g2qYJnM/S220/jbinkowski.png'/></author><thr:total>1</thr:total></entry></feed>
