<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>przemkovv&#039;s world &#187; Programowanie</title>
	<atom:link href="http://przemkovv.net/tag/programowanie/feed/" rel="self" type="application/rss+xml" />
	<link>http://przemkovv.net</link>
	<description>The future is now</description>
	<lastBuildDate>Sun, 09 Oct 2011 20:17:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Obliczenia na typach generycznych w C#</title>
		<link>http://przemkovv.net/2010/08/15/obliczenia-na-typach-generycznych-w-c/</link>
		<comments>http://przemkovv.net/2010/08/15/obliczenia-na-typach-generycznych-w-c/#comments</comments>
		<pubDate>Sun, 15 Aug 2010 11:41:36 +0000</pubDate>
		<dc:creator>Przemysław Walkowiak</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[C#4.0]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[generic type]]></category>
		<category><![CDATA[Programowanie]]></category>

		<guid isPermaLink="false">http://przemkovv.net/?p=147</guid>
		<description><![CDATA[Rozwijam właśnie aplikację w której niezbędne jest przeprowadzanie obliczeń na niekoniecznie z góry znanych typach. W celu zapewnienia elastyczności poszczególnych klas zdecydowałem się na implementacje klas generycznych. Załóżmy, że mamy taką oto klasę: 1 2 3 4 public class Klasa&#60; T &#62; &#123; public T Field1; public T Field2; &#125; Następnie utwórzmy metodę, która ma [...]]]></description>
			<content:encoded><![CDATA[<p>Rozwijam właśnie aplikację w której niezbędne jest przeprowadzanie obliczeń na niekoniecznie z góry znanych typach. W celu zapewnienia elastyczności poszczególnych klas zdecydowałem się na implementacje klas generycznych. Załóżmy, że mamy taką oto klasę:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Klasa<span style="color: #008000;">&lt;</span> T <span style="color: #008000;">&gt;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> T Field1<span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> T Field2<span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Następnie utwórzmy metodę, która ma za zadanie zsumować oba pola i zwrócić wynik. Intuicyjnie powstanie taki kod:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;">    <span style="color: #0600FF; font-weight: bold;">public</span> T SumFields<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">return</span> Field1 <span style="color: #008000;">+</span> Field2<span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Jednakże podczas kompilacji zostaniemy uraczeni następującym błędem:<br />
<code>Error	1	Operator '+' cannot be applied to operands of type 'T' and 'T'</code></p>
<p>Po chwili zastanowienia nie można się kompilatorowi dziwić, nie każdy typ musi mieć zaimplementowany operator dodawania (a także odejmowania, mnożenia, itd.). Znająć z kolei chęci programistów Microsoft do projektowania interfejsów do &#8222;wszystkiego&#8221; zaczałem szukać takiego, który deklarowałby powyższe operatory. Niestety czegoś takiego jeszcze nie ma (może kiedyś będzie?). I należy się posiłkować innymi metodami.</p>
<p>W tym celu można wykorzystać wprowadzony w C# 4.0 nowy typ <code>dynamic</code>. Deklarując zmienną typu <code>dynamic</code> zmieniamy moment, w którym rozwiązywany jest jej typ. Normalnie proces ten jest realizowany w czasie kompilacji, natomiast w przypadku <code>dynamic</code> w czasie działania programu (podobnie jak w językach skryptowych bez ścisłego typowania).</p>
<p>Po drobnej modyfikacji metoda będzie wyglądała następująco:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;">    <span style="color: #0600FF; font-weight: bold;">public</span> T SumFields<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        dynamic dField1 <span style="color: #008000;">=</span> Field1, dField2 <span style="color: #008000;">=</span> Field2<span style="color: #008000;">;</span>
        <span style="color: #0600FF; font-weight: bold;">return</span> dField1 <span style="color: #008000;">+</span> dField2<span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>
<div class="bottomcontainerBox" style="border:1px solid #808080; border-radius:5px 5px 5px 5px; box-shadow:2px 2px 5px rgba(0,0,0,0.3);background-color:#F0F4F9;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fprzemkovv.net%2F2010%2F08%2F15%2Fobliczenia-na-typach-generycznych-w-c%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:80px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://przemkovv.net/2010/08/15/obliczenia-na-typach-generycznych-w-c/"></g:plusone>
			</div>
			<div style="float:left; width:95px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://przemkovv.net/2010/08/15/obliczenia-na-typach-generycznych-w-c/"  data-text="Obliczenia na typach generycznych w C#" data-count="horizontal" data-via="przemkovv">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://przemkovv.net/2010/08/15/obliczenia-na-typach-generycznych-w-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Matematyka i C#</title>
		<link>http://przemkovv.net/2008/07/29/matematyka-i-csharp/</link>
		<comments>http://przemkovv.net/2008/07/29/matematyka-i-csharp/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 23:09:21 +0000</pubDate>
		<dc:creator>Przemysław Walkowiak</dc:creator>
				<category><![CDATA[]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Matematyka]]></category>
		<category><![CDATA[Programowanie]]></category>

		<guid isPermaLink="false">http://przemkovv.net/?p=56</guid>
		<description><![CDATA[Wiele razy już w przeciągu ostatnich 2-3 lat szukałem jakiejś porządnej biblioteki implementującej podstawowe algorytmy z algebry liniowej i ogólnie z matematyki. Wbrew pozorom znalezienie tychże dla platformy .NET nie jest takie trywialne.. Po odpytaniu google o jakikolwiek silnik matematyczny natrafiamy na cenioną open sourcową bibliotekę GSL. Z mojego punktu widzenia ma ona jedną wadę: [...]]]></description>
			<content:encoded><![CDATA[<p>Wiele razy już w przeciągu ostatnich 2-3 lat szukałem jakiejś porządnej biblioteki implementującej podstawowe algorytmy z algebry liniowej i ogólnie z matematyki. Wbrew pozorom znalezienie tychże dla platformy .NET nie jest takie trywialne..</p>
<p>Po odpytaniu google o jakikolwiek silnik matematyczny natrafiamy na cenioną open sourcową bibliotekę <a title="GSL" href="http://www.gnu.org/software/gsl/">GSL</a>. Z mojego punktu widzenia ma ona jedną wadę: jest mocno nastawianona na środowisko Linuksowe. O ile istnieją wersje przeportowane na system Win32 (nie mówię tutaj o Cygwinie) to nie były już aktualizowane kilka lat. A o automagicznym podpięciu się z poziomu C# można praktyczznie pomarzyć..</p>
<p>Następna kolekcja matematyczna jak wpadła mi w ręce to <a href="http://www.codeplex.com/dnAnalytics">dnAnalytics</a>. Muszę przyznać, że jest ona bardzo dobrze przygotowana zapewniając bardzo wygodny i intyuicyjny intefejs programistyczny. Z podstawowych możliwości udostępnianych mogę wymienić własną implementację struktury do obsługi macierzy i wektorów, możliwość wczytywania i zapisywania danych z/do plików CSV, chyba wszystkie najważniejsze operacje na macierzach oraz szereg algorytmów do rozwiązywania równań, dekompozycji macierzy (SVD, LU, QR) i co najważniejsze ma zaimplementowane wsparcie dla natywnej biblioteki <a href="http://www.intel.com/cd/software/products/asmo-na/eng/307757.htm">Intel Math Kernel Library</a>, dzięki czemu znacząco zyskujemy na wydajności. Niestety dnAnalytics miał jedną wadę: nie w pełni wykorzystywał możliwości MKL.</p>
<p>W ten sposób dotarłem (całkiem przypadkowo) od <a href="http://ilnumerics.net/">ILNumerics.Net</a>. Porównując z dnAnalytics to ma raczej trochę inny interfejs (ani nie lepszy, ani nie gorszy, po prostu inny) przypominający bardziej język skryptowy  z <a href="http://www.scilab.org/">Scilaba</a> czy <a href="Matlaba">Matlaba</a> (między innymi odwoływanie się do pól macierzy). A skoro jestem przy macierzach to warto wspomnieć, że w tym przypadku nie jesteśmy ograniczeni tylko do dwóch wymiarów i typu double, ale dzięki typom generycznym możemy wykorzystać niemal dowolny typ numeryczny w wielomiarowej przestrzeni. Malutkim minusem jest brak obsługi plików CSV do których przyzwyczaiła mnie dnAnalytics, ale coś za coś. Na zakończenie jeszcze jeden ogromny plus: w pełni wykorzystuje zestaw funkcji LINPACK z natywnej biblioteki MKL, a także dodatkowo z konkurencyjnej biblioteki firmy AMD. Dla zachowania kompatybilności z platformą mono powstała również specjalna wersja natywnego silnika matematycznego.</p>
<p>Podsumowując dnAnalytics jest bardzo przejrzystą biblioteką nadającą się do projektów w których nie wymaga się dużej wydajności i ograniczamy się do dwóch wymiarów. ILNumerics.Net jest natomiast prawdziwą perełką wśród otwartych bibliotek matematycznych, a dzięki porządnemu połączeniu z MKL i pochodnymi jest naprawdę wydajnym tworem.</p><div class="bottomcontainerBox" style="border:1px solid #808080; border-radius:5px 5px 5px 5px; box-shadow:2px 2px 5px rgba(0,0,0,0.3);background-color:#F0F4F9;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fprzemkovv.net%2F2008%2F07%2F29%2Fmatematyka-i-csharp%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:80px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://przemkovv.net/2008/07/29/matematyka-i-csharp/"></g:plusone>
			</div>
			<div style="float:left; width:95px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://przemkovv.net/2008/07/29/matematyka-i-csharp/"  data-text="Matematyka i C#" data-count="horizontal" data-via="przemkovv">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://przemkovv.net/2008/07/29/matematyka-i-csharp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Visual Studio 2008 SP1 Beta i .NET 3.5 SP1 Beta</title>
		<link>http://przemkovv.net/2008/05/24/visual-studio-2008-sp1-beta-i-net-35-sp1-beta/</link>
		<comments>http://przemkovv.net/2008/05/24/visual-studio-2008-sp1-beta-i-net-35-sp1-beta/#comments</comments>
		<pubDate>Fri, 23 May 2008 22:00:54 +0000</pubDate>
		<dc:creator>Przemysław Walkowiak</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[RubiksCube]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://przemkovv.net/2008/05/24/visual-studio-2008-sp1-beta-i-net-35-sp1-beta/</guid>
		<description><![CDATA[Parę dni temu coś mnie podkusiło do instalacji wersji beta nowego service packa do VS2008 i .NET3.5. Instalacja przeszła względnie bezboleśnie (musiałem tylko zwolnić trochę miejsca na dysku;) ). I wszystko byłoby OK, gdyby nie fakt, że RubiksCube v2 przestał działać.. A dokładniej po wykonaniu dowolnego ruchu wywalał się bliżej nieokreślony błąd w PresentationCore.dll (bliżej [...]]]></description>
			<content:encoded><![CDATA[<p>Parę dni temu coś mnie podkusiło do instalacji wersji beta nowego service packa do VS2008 i .NET3.5. Instalacja przeszła względnie bezboleśnie (musiałem tylko zwolnić trochę miejsca na dysku;) ). </p>
<p>I wszystko byłoby OK, gdyby nie fakt, że RubiksCube v2 przestał działać..<br />
A dokładniej po wykonaniu dowolnego ruchu wywalał się bliżej nieokreślony błąd w PresentationCore.dll (bliżej nieokreślony, bo opisu błędu wogóle nie było). Co lepsze przed SP1 Beta aplikacja działała prawidłowo&#8230;</p>
<p>Błędu szukałem komentując po kolei poszczególne fragmenty kodu i dotarłem do takiej konstrukcji</p>
<pre lang="csharp" lineno="1">if (model == null)
{
    model = new Model3DGroup();
}
else
{
    model.Children.Clear();
}</pre>
<p>Gdzie <em>model</em> jest typu <em>Model3DGroup</em>. Doszedłem do tego, że aplikacja wywalała się przez linijkę 7. Nie wiem dlaczego tak się zachowywał, ale błąd naprawiłem w następujący sposób:</p>
<pre lang="csharp" lineno="1">if (model == null)
{
    model = new Model3DGroup();
}
else
{
    model.Children = new Model3DCollection();
}</pre>
<p>I jak na razie aplikacja śmiga <img src='http://przemkovv.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p><div class="bottomcontainerBox" style="border:1px solid #808080; border-radius:5px 5px 5px 5px; box-shadow:2px 2px 5px rgba(0,0,0,0.3);background-color:#F0F4F9;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fprzemkovv.net%2F2008%2F05%2F24%2Fvisual-studio-2008-sp1-beta-i-net-35-sp1-beta%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:80px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://przemkovv.net/2008/05/24/visual-studio-2008-sp1-beta-i-net-35-sp1-beta/"></g:plusone>
			</div>
			<div style="float:left; width:95px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://przemkovv.net/2008/05/24/visual-studio-2008-sp1-beta-i-net-35-sp1-beta/"  data-text="Visual Studio 2008 SP1 Beta i .NET 3.5 SP1 Beta" data-count="horizontal" data-via="przemkovv">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://przemkovv.net/2008/05/24/visual-studio-2008-sp1-beta-i-net-35-sp1-beta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debugger w Visual Studio</title>
		<link>http://przemkovv.net/2008/03/02/debugger-w-visual-studio/</link>
		<comments>http://przemkovv.net/2008/03/02/debugger-w-visual-studio/#comments</comments>
		<pubDate>Sun, 02 Mar 2008 13:29:44 +0000</pubDate>
		<dc:creator>Przemysław Walkowiak</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://przemkovv.net/2008/03/02/debugger-w-visual-studio/</guid>
		<description><![CDATA[Jak wiadomo debugger dla programisty to jest bardzo ważne narzędzie, które potrafi znacząco ułatwić pracę. Moim zdaniem w Visual Studio znajduje się chyba jeden z najlepszych pod względem intuicyjnego używania (aczkolwiek dawno nie korzystałem z produktów Borlanda, tam może też się co nieco zmieniło;) ). Nie będę tutaj opisywał jak z poziomu środowiska IDE obsługiwać [...]]]></description>
			<content:encoded><![CDATA[<p>Jak wiadomo debugger dla programisty to jest bardzo ważne narzędzie, które potrafi znacząco ułatwić pracę. Moim zdaniem w Visual Studio znajduje się chyba jeden z najlepszych pod względem intuicyjnego używania (aczkolwiek dawno nie korzystałem z produktów Borlanda, tam może też się co nieco zmieniło;) ). Nie będę tutaj opisywał jak z poziomu środowiska IDE obsługiwać to narzędzie, gdyż to raczej każdy już sie z tym zapoznał, ale jak z niego korzystać z poziomu kodu.</p>
<p>W ogólności służy do tego klasa<em>System.Diagnostics.Debugger</em>. Co prawda posiada ona tylko trzy metody przydatne dla programisty, ale liczba ich nie jest istotna;).</p>
<ul>
<li><em>Debugger.Break()</em> &#8211; powoduje zatrzymanie działania programu i włączenie debuggera (coś a la standardowy breakpoint)</li>
<li><em>Debugger.Launch()</em> &#8211; uruchamia debugger i podłącza go do aktualnego procesu, ale jeszcze go nie zatrzymuje</li>
<li><em>Debugger.Log(int level, string category, string message</em> &#8211; wykorzystuje w przypadku, gdy chcemy wysłać na konsolę debuggera informację zwrotną. Nie potrzebujemy w tym wypadku tworzyć aplikacji konsolowej &#8211; w ogóle nie musi ona posiadać jakiegokolwiek okna <img src='http://przemkovv.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
</ul>
<p>Ciekawostką jest to, że wywołania tych metod zostają usuwane w wersji Release projektu. Są one dostępne jedynie w wersji Debug.<br />
Przydatności metody <em>Log()</em> chyba nie trzeba tłumaczyć. Zawsze przecież przydają się dodatkowe informacje w przypadku, gdy badamy rozbudowaną i przebiegającą przez wiele iteracji funkcję.</p>
<p><em>Break()</em> możemy oczywiście zastąpić standardowym Breakpointem z IDE, ale ma taką zaletę, że zadziała nawet wtedy gdy nie będziemy uruchamiali aplikacji z VisualStudio. Przydatne przy badaniu WebService&#8217;ów zainstalowanych na <acronym title="Internet Information Services">IIS</acronym>;) </p>
<p>Sąsiednią klasą towarzyszącą <em>System.Diagnostics.Debugger</em> jest <em>System.Diagnostics.Debug</em> udostęniająca asercje (<em>Assert(bool condition)</em> &#8211; przy czym warunek musi być spełniony, aby program działał poprawnie) oraz bardziej rozbudowane metody do obsługi wyjścia w konsoli debuggera takie jak <em>Write</em>, <em>WriteIf</em>, <em>WriteLine</em>, <em>WriteLineIf</em>, <em>Indent</em>, <em>Unindent</em>, <em>Print</em>. W każdym bądź razie polecam się z nimi zapoznać <img src='http://przemkovv.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p><div class="bottomcontainerBox" style="border:1px solid #808080; border-radius:5px 5px 5px 5px; box-shadow:2px 2px 5px rgba(0,0,0,0.3);background-color:#F0F4F9;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fprzemkovv.net%2F2008%2F03%2F02%2Fdebugger-w-visual-studio%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:80px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://przemkovv.net/2008/03/02/debugger-w-visual-studio/"></g:plusone>
			</div>
			<div style="float:left; width:95px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://przemkovv.net/2008/03/02/debugger-w-visual-studio/"  data-text="Debugger w Visual Studio" data-count="horizontal" data-via="przemkovv">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://przemkovv.net/2008/03/02/debugger-w-visual-studio/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Typy generyczne w C# i „drobne” niedociągnięcie</title>
		<link>http://przemkovv.net/2008/02/23/typy-generyczne-w-c-i-%e2%80%9edrobne%e2%80%9d-niedociagniecie/</link>
		<comments>http://przemkovv.net/2008/02/23/typy-generyczne-w-c-i-%e2%80%9edrobne%e2%80%9d-niedociagniecie/#comments</comments>
		<pubDate>Sat, 23 Feb 2008 21:48:53 +0000</pubDate>
		<dc:creator>Przemysław Walkowiak</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://przemkovv.net/2008/02/23/typy-generyczne-w-c-i-%e2%80%9edrobne%e2%80%9d-niedociagniecie/</guid>
		<description><![CDATA[Zacznę może od tego, że potrzebuję w pewnym projekcie pisanym w C# obsługę macierzy (dodawanie, mnożenie, ślad, itp). Konkretniej chodzi o macierz skonstruowaną z elementów typu prostego Double, ale dobrą cechą byłaby jej uniwersalność (czyli obsługa dowolnych typów) – w skrócie macierz generyczna. Ponieważ jestem troszku leniwy więc rozpocząłem poszukiwania odpowiednich bibliotek w Internecie. Niestety [...]]]></description>
			<content:encoded><![CDATA[<p>Zacznę może od tego, że potrzebuję w pewnym projekcie pisanym w C# obsługę macierzy (dodawanie, mnożenie, ślad, itp). Konkretniej chodzi o macierz skonstruowaną z elementów typu prostego <em>Double</em>, ale dobrą cechą byłaby jej uniwersalność (czyli obsługa dowolnych typów) – w skrócie macierz generyczna. Ponieważ jestem troszku leniwy więc rozpocząłem poszukiwania odpowiednich bibliotek w Internecie. Niestety jedynym rozwiązaniem godnym przejrzenia, aczkolwiek niespełniącym moich wymagań była biblioteka <a href="http://www.codeproject.com/KB/cs/CSML.aspx">CSML</a>. Wadą jej polega na tym, że natywnie operuje na liczbach zespolonych (co można oczywiście zarzutować w przestrzeń liczb rzeczywistch) i nie ma domyślnie zrobionej konwersji <em>Double</em> na <em>Complex</em>.
</p>
<p>Zdziwiło mnie, że taka ważna struktura w obliczeniach numerycznych nie dorobiła się pożądnej implementacji (dodam jeszcze: darmowej).. No cóż, w takim razie należy samemu napisać odpowiedni kod. </p>
<p>Zacząłem od stworzenia szkieletu klasy:
</p>
<pre lang="csharp" lineno="1">public class Matrix< T >
{
	T[,] matrix;
        public int N { get; private set; }
        public int M { get; private set; }
        public Matrix(int n, int m)
        {
        }

        public T this[int i, int j]
        {
        }
	public static Matrix< T > operator +(Matrix< T > A, Matrix< T > B)
	{
	}
	public static Matrix< T > operator -(Matrix< T > A, Matrix< T > B)
	{
	}
	public static Matrix< T > operator *(Matrix< T > A, Matrix< T > B)
	{
	}
}
</pre>
<p>
 </p>
<p>Dokonałem następnie implementacji pierwszego z operatorów:
</p>
<p><pre lang="csharp" lineno="1">        public static Matrix< T > operator +(Matrix< T > A, Matrix< T > B)
        {
            if (A.N == B.N &#038;&#038; A.M == B.M)
            {
                Matrix< T > result = new Matrix< T >(A.N, A.M);
                for (int i = 0; i < A.N; i++)
                {
                    for (int j = 0; j < A.M; j++)
                    {
                        result[i, j] = A[i, j] + B[i, j];
                    }
                }
                return result;
            }
            else
            {
                throw new Exception("Matrices have different dimensions");
            }
        }</pre>
</pre>
<p>Próba kompilacji i&#8230; błąd: <em>&#8222;Operator &#8216;+&#8217; cannot be applied to operands of type &#8216;T&#8217; and &#8216;T&#8217;&#8221;</em>. W sumie prawda, skąd kompilator ma wiedzieć, czy typ <em>T</em> ma zaimplementowany operator dodawania. Właśnie po to wprowadzono system reguł mogący wymusić na danym typie kilka cech. Zaglądam więc do dokumentacji <acronym title="Microsoft Developer Network">MSDN</acronym> i niestety nic ciekawego nie znalazłem. Odpalam wyszukiwarkę dotarłem do kilku wątków o tym samym problemie i jedyną odpowiedzią jest to, że: nie można czegoś takiego zrobić ponieważ <em>Double</em> jest typem prostym.
</p>
<p>Ostatecznie jest jeszcze jedno rozwiązanie (<a href="http://www.codeproject.com/KB/cs/genericnumerics.aspx">&#8222;Using generics for calculations&#8221;</a>), ale moim zdaniem nie do końca jest ono wzorowe z tego względu, że należałoby stosować dodatkową warstwę pomiędzy typami <em>Int32, Double</em> a naszą klasą generyczną. Ale dużego wyboru nie ma..</p><div class="bottomcontainerBox" style="border:1px solid #808080; border-radius:5px 5px 5px 5px; box-shadow:2px 2px 5px rgba(0,0,0,0.3);background-color:#F0F4F9;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fprzemkovv.net%2F2008%2F02%2F23%2Ftypy-generyczne-w-c-i-%25e2%2580%259edrobne%25e2%2580%259d-niedociagniecie%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:80px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://przemkovv.net/2008/02/23/typy-generyczne-w-c-i-%e2%80%9edrobne%e2%80%9d-niedociagniecie/"></g:plusone>
			</div>
			<div style="float:left; width:95px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://przemkovv.net/2008/02/23/typy-generyczne-w-c-i-%e2%80%9edrobne%e2%80%9d-niedociagniecie/"  data-text="Typy generyczne w C# i „drobne” niedociągnięcie" data-count="horizontal" data-via="przemkovv">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://przemkovv.net/2008/02/23/typy-generyczne-w-c-i-%e2%80%9edrobne%e2%80%9d-niedociagniecie/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>XML to XSD? XML to Classes?</title>
		<link>http://przemkovv.net/2008/01/12/xml-to-xsd-xml-to-classes/</link>
		<comments>http://przemkovv.net/2008/01/12/xml-to-xsd-xml-to-classes/#comments</comments>
		<pubDate>Sat, 12 Jan 2008 02:59:27 +0000</pubDate>
		<dc:creator>Przemysław Walkowiak</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Kostka Rubika]]></category>
		<category><![CDATA[Orcas]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://przemkovv.net/2008/01/12/xml-to-xsd-xml-to-classes/</guid>
		<description><![CDATA[Wróciłem po dłuższym czasie do mojego hobbistycznego projektu RubiksCube v2. Zrobiłem ponieważ pojawiła się iskierka nadzieji, że zaliczę na uczelni nim laboratoria z baz danych. Tak więc brakującą częścią do tej pory była cała inteligencja układania kostki. Algorytmy (sekwencje ruchów) już kiedyś postanowiłem przechowywać w pliku XML. Wczoraj dokończyłem projektowanie pliku XML Scheme i.. zacząłem [...]]]></description>
			<content:encoded><![CDATA[<p>Wróciłem po dłuższym czasie do mojego hobbistycznego projektu RubiksCube v2. Zrobiłem ponieważ pojawiła się iskierka nadzieji, że zaliczę na uczelni nim laboratoria z baz danych. Tak więc brakującą częścią do tej pory była cała inteligencja układania kostki. Algorytmy (sekwencje ruchów) już kiedyś postanowiłem przechowywać w pliku <acronym title="eXtensible Markup Language">XML</acronym>. Wczoraj dokończyłem projektowanie pliku <acronym title="eXtensible Markup Language">XML</acronym> Scheme i.. zacząłem się zastanawiać jak to wykorzystać w projekcie. Rozwiązań było kilka:
</p>
<ol>
<li>Ręcznie parsować plik <acronym title="eXtensible Markup Language">XML</acronym> – to już przeszłość&#8230;
</li>
<li>Skorzystać z zintegrowanego z platformą parsera <acronym title="eXtensible Markup Language">XML</acronym> oraz XPath – niestety jest to nadal bardzo wiele roboty i można się zagubić w którymś momencie
</li>
<li>Skorzystać z LINQ to <acronym title="eXtensible Markup Language">XML</acronym> – to już wygląda dużo lepiej, ale nadal trzeba się odwoływać do elementów poprzez obiekt Xelement, no i brak jest ścisłego typowania obiektów na typy z XSD.
</li>
<li>Dzisiaj znalazłem jeszcze taki projekt jak LINQ to XSD. Robi to wszystko co LINQ to <acronym title="eXtensible Markup Language">XML</acronym> z jednym małym dodatkiem. Pozwala na ścisłe typowanie obiektów, a to dzięki temu, że sam automatycznie generuje odpowiednie klasy w C#. Niestety wadą uniemożliwiającą skorzystanie z tego cudownego narzędzia jest to, że chwilowo nie jest rozwijany a ostatnia wersja pamięta czasy Visual Studio Orcas beta 1. I z powodu niekompatybilności wersji System.Xml.Linq nie da się tego w prosty sposób uruchomić na wersji RTM. Należy cierpliwie czekać na dalszy bieg wydarzeń&#8230;
</li>
<li>Szukając dalej znalazłem coś takiego jak <a href="http://bware.biz/">CodeXS</a>. Potrafi przekonwertować plik XSD na zestaw klas C# (także <acronym title="Visual Basic">VB</acronym>), a następnie jednym poleceniem wypełnić wszystkie struktury danymi z pliku <acronym title="eXtensible Markup Language">XML</acronym> opartego na danym XSD z zachowaniem wszystkich typów (także wyliczeniowych) oraz bardziej skomplikowanych struktur. Na stronie producenta jest dostępna wersja online (wysyłamy plik XSD na serwer i ściągamy archiwum z klasami) oraz postać źródłowa tej aplikacji. W prosty sposób można ją podpiąć pod zdarzenia pre-build w projekcie VS i mamy ładny generator kodu na podstawie XSD. Wadą jest niestety to, że chyba nie będzie można wykorzystać tutaj LINQ, gdyż na pierwszy rzut oka nie ma odpowiedniego wsparcia ze strony IDE. Ale poszukam może jeszcze czegoś na ten temat.
</li>
</ol>
<p>Ostatecznie waham się pomiędy rozwiązaniem trzecim a piątym (czwarte naprawdę niestety odpada). Trzecie na obecną chwilę mimo trochę bardziej skomplikowanej składni pozwala na wygodne przeszukiwanie, piąte natomiast posiada bardzo dobre typowanie danych, a z przeszukiwaniem gorzej.</p><div class="bottomcontainerBox" style="border:1px solid #808080; border-radius:5px 5px 5px 5px; box-shadow:2px 2px 5px rgba(0,0,0,0.3);background-color:#F0F4F9;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fprzemkovv.net%2F2008%2F01%2F12%2Fxml-to-xsd-xml-to-classes%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:80px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://przemkovv.net/2008/01/12/xml-to-xsd-xml-to-classes/"></g:plusone>
			</div>
			<div style="float:left; width:95px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://przemkovv.net/2008/01/12/xml-to-xsd-xml-to-classes/"  data-text="XML to XSD? XML to Classes?" data-count="horizontal" data-via="przemkovv">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://przemkovv.net/2008/01/12/xml-to-xsd-xml-to-classes/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>MS Visual Studio 2008</title>
		<link>http://przemkovv.net/2007/12/06/ms-visual-studio-2008/</link>
		<comments>http://przemkovv.net/2007/12/06/ms-visual-studio-2008/#comments</comments>
		<pubDate>Thu, 06 Dec 2007 01:17:27 +0000</pubDate>
		<dc:creator>Przemysław Walkowiak</dc:creator>
				<category><![CDATA[Orcas]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://przemkovv.net/2007/12/06/ms-visual-studio-2008/</guid>
		<description><![CDATA[Wracam po dosyć długim okresie niepisania. Niestety nie miałem żadnego pomysłu na notkę. Teraz spróbuję się w końcu zmobilizować:P. Wczoraj i dzisiaj (tzn. przedworaj i wczoraj) na uczelni odbywała się konferencja IT Academic Day. Według mnie najciekawsze były wykłady ludzi przysłanych z Microsoft Polska. Jedna o nowinkach w Windows Server 2008, a druga o nowinkach [...]]]></description>
			<content:encoded><![CDATA[<p>Wracam po dosyć długim okresie niepisania. Niestety nie miałem żadnego pomysłu na notkę. Teraz spróbuję się w końcu zmobilizować:P. <br />Wczoraj i dzisiaj (tzn. przedworaj i wczoraj) na uczelni odbywała się konferencja IT Academic Day. Według mnie najciekawsze były wykłady ludzi przysłanych z Microsoft Polska. Jedna o nowinkach w Windows Server 2008, a druga o nowinkach w .NET3.0/3.5
</p>
<p>Jeśli chodzi o .NET3.5 to postanowiłem dalej rozwijać moją aplikację badawczą RubiksCube v2, wykorzystując i teraz jakieś względnie nowe rzeczy (dopiero teraz wyszła oficjalna wersja Visual Studio 2008). W tym momencie zapewne najbardziej się skupię na XLINQ, gdyż algorytmy do układania kostki zamierzam zawrzeć w pliku <acronym title="eXtensible Markup Language">XML</acronym>, a to powinno ułatwić ich wyciąganie <img src='http://przemkovv.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  .<br />Jeśli chodzi o oficjalną wersję VS2008 to zainstalowała się bezproblemowo (w przeciwieństwie do kolegi <a href="http://people.itdt.pl/dmk/blog/">Dawida</a> <img src='http://przemkovv.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ) I na pierwszy rzut oka chodzi trochę lepiej niż wersje beta oraz VS2005. Jak jest w rzeczywistości okaże się w praniu <img src='http://przemkovv.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
</p>
<p>Przy okazji: to jest pierwsza notka dodana z Worda;)</p><div class="bottomcontainerBox" style="border:1px solid #808080; border-radius:5px 5px 5px 5px; box-shadow:2px 2px 5px rgba(0,0,0,0.3);background-color:#F0F4F9;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fprzemkovv.net%2F2007%2F12%2F06%2Fms-visual-studio-2008%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:80px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://przemkovv.net/2007/12/06/ms-visual-studio-2008/"></g:plusone>
			</div>
			<div style="float:left; width:95px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://przemkovv.net/2007/12/06/ms-visual-studio-2008/"  data-text="MS Visual Studio 2008" data-count="horizontal" data-via="przemkovv">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://przemkovv.net/2007/12/06/ms-visual-studio-2008/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Mechanizm refleksji</title>
		<link>http://przemkovv.net/2007/08/03/mechanizm-refleksji/</link>
		<comments>http://przemkovv.net/2007/08/03/mechanizm-refleksji/#comments</comments>
		<pubDate>Thu, 02 Aug 2007 22:05:36 +0000</pubDate>
		<dc:creator>Przemysław Walkowiak</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Programowanie]]></category>

		<guid isPermaLink="false">http://przemkovv.net/2007/08/03/mechanizm-refleksji/</guid>
		<description><![CDATA[Jednym z przyczyn dla której platforma .NET jest tak elastyczna jest mechanizm refleksji. Prościej mówiąc modyfikacja programu w czasie jego działania. Przykładem użycia może być wywoływanie metod nieznając ich nazw w czasie pisania programu albo tworzenie obiektów z klas znajdujących się w zewnętrznych bibliotekach (inaczej: system wtyczek). Żeby nie było nie występuje on tylko w [...]]]></description>
			<content:encoded><![CDATA[<p>Jednym z przyczyn dla której platforma .NET jest tak elastyczna jest mechanizm refleksji. Prościej mówiąc modyfikacja programu w czasie jego działania. Przykładem użycia może być wywoływanie metod nieznając ich nazw w czasie pisania programu albo tworzenie obiektów z klas znajdujących się w zewnętrznych bibliotekach (inaczej: system wtyczek).<br />
Żeby nie było nie występuje on tylko w produktach firmy Microsoft, ale także w innych językach: <acronym title="Pre-Hypertext Processing">PHP</acronym>, Java, <acronym title="Practical Extraction and Report Language">Perl</acronym>, Ruby. W których został zaimplementowany już dosyć dawno.<br />
<span id="more-29"></span><br />
Wracając do tematu zaprezentuję tutaj jak można wykorzystać refleksję w praktyce.</p>
<p>Najpierw o najprostszym przypadku: wywołanie metody jakiegoś obiektu.<br />
W pierwszej kolejności musimy pobrać typ naszego obiektu, możemy pobrać go za pomocą funkcji <em>GetType() </em>jeśli już jakiś obiekt istnieje, albo za pomocą <em>typeof(Klasa)</em>. W obu przypadkach zostanie zwrócony obiekt typu <em>Type</em>.<br />
<em>Type</em> jest w stanie dostarczyć nam wiele informacji na temat dowolnego typu, począwszy od konstruktorów, destruktorów, poprzez pola, metody aż po typy po których dziedziczy. Pozwala także na wykonywanie metod i zmianę wartości pól. Do tego ostatniego służy metoda <em>InvokeMember</em>. W najprostszej wersji przyjmuje pięć argumentów:</p>
<pre lang="csharp" lineno="1">public Object InvokeMember (
	string name,
	BindingFlags invokeAttr,
	Binder binder,
	Object target,
	Object[] args
)</pre>
<p>Pierwszy <em>name</em> jest nazwą pola, metody do którego chcemy się odwołać.<br />
Drugi określa czego będziemy pod tą nazwą szukali i co zamierzamy z tym zrobić. Najbardziej interesującym flagami są: </p>
<ul>
<li><em>Public</em>, <em>NonPublic</em> &#8211; czy pole jest dostępne ma status publiczny czy prywatny.</li>
<li><em>InvokeMethod</em> &#8211; znaleziona metoda zostać wywołana</li>
<li><em>GetField</em>, <em>SetField</em>, <em>GetProperty</em>, <em>SetProperty</em> &#8211; ma zostać pobrana/ustawiona wartość pola lub własciwości</li>
<li><em>CreateInstance</em> &#8211; zanim cokolwiek się wykona zostanie utworzony nowy obiekt danego typu i na nim będą przeprowadzone operacje.</li>
</ul>
<p>Na chwilę obecną jeszcze nie za bardzo się orientuję w wykorzystaniu trzeciego parametru <em>binder</em>, więc swobodnie można tam wstawić wartość null. <em>target</em> jest obiektem na którym ma być wykonana operacja. Jeśli wybraliśmy flagę <em>CreateInstance</em> możemy wstawić null. Ostatnim argumentem jest tablica zawierająca wartości potencjalnych argumentów metody lub wartość jaka ma być przypisana polu.<br />
Koniec wstępu teoretycznego, a teraz praktyka:</p>
<pre lang="csharp" lineno="1">Type type = GetType();
type.InvokeMember("RotateXCW",
          BindingFlags.InvokeMethod |BindingFlags.NonPublic,
          null,
          this,
          null);
</pre>
<p>Prawda, że proste?<br />
Pobieramy typ aktualnego obiektu w którym znajduje się ten fragment kodu, a następnie wywołujemy prywatną (<em>NonPublic</em>) metodę <em>RotateXCW</em> w bieżącym obiekcie.</p>
<p>Jeśli metoda ma argumenty to kod będzie wyglądał następująco:</p>
<pre lang="csharp" lineno="1">Type type = GetType();
type.InvokeMember("RotateXCW",
      BindingFlags.InvokeMethod |BindingFlags.NonPublic,
      null,
      this,
      new object [] { "Pierwszy argument typu string", 10, new Button() );
</pre>
<p>Przekazujemy tablicę obiektów, w tym przypadku: napis, liczbę (integer) i kontrolkę przycisku.</p>
<p>Skoro już wiadomo w jak prosty sposób można wywołać metodę obiektu no to teraz pokażę, jak stworzyć obiekt i jak zrobić prosty system wtyczek.<br />
Kod do realizujący to zadanie będzie wyglądał mniej więcej tak:</p>
<pre lang="csharp" lineno="1">string [] files = Directory.GetFiles(pluginPath, "*.dll");

for(int i = 0; i < files.Length; i++)
{
// Ladujemy Assembly z pliku
Assembly asm = Assembly.LoadFrom(files[i]);

// Sprawdzamy typy zawarte w bibliotece
foreach (Type type in asm.GetTypes())
{
  // Szukamy tylko publicznych, nieabstrakcyjnych klas
  if(type.IsPublic &#038;&#038; !type.IsAbstract)
  {

    // Sprawdzamy czy dziedziczy po naszym intefrace'ie
    Type iFace = type.GetInterface("plugInterfaces.IPlugin", true);

    // Jezeli tak - zapisujemy do pluginow
    if(iFace != null)
    {
      IPlugin tmp = (IPlugin)Activator.CreateInstance(asm.GetType(type.ToString())); // Tworzymy nową instancję pluginu
      plugins.Add(tmp); // Dodajemy plugin

      tmp = null; // Czyscimy po sobie
    }

    iFace = null; // Czyscimy po sobie

    }
}
asm = null; // Czyscimy po sobie
</pre>
<p>W pierwszej linii pobieramy listę plików dll z katalogu z wtyczkami. W linii 6 ładujemy każdą dll'kę i następnie pobieramy wszystkie znajdujące się w niej typy (linia 9). Sprawdzamy, czy to jest klasa której instancję możemy bezproblemowo utworzyć (filtrujemy wszystkie klasy abstrakcyjne, interfejsy, itp).<br />
Konstrukcja z linii 16 i 19 służy do zapewnienia, że dana klasa w pełni implementuje intefejs <em>IPlugin</em> (który jest definiowany przez programistę). W 21 tworzymy obiekt oraz wrzucamy go na listę naszych wtyczek. Sprzątamy po sobie i w ostateczności mamy listę wszystkich obiektów-wtyczek implementujących dany interfejs, którą możemy wykorzystać w dowolny już sposób.</p>
</pre><div class="bottomcontainerBox" style="border:1px solid #808080; border-radius:5px 5px 5px 5px; box-shadow:2px 2px 5px rgba(0,0,0,0.3);background-color:#F0F4F9;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fprzemkovv.net%2F2007%2F08%2F03%2Fmechanizm-refleksji%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:80px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://przemkovv.net/2007/08/03/mechanizm-refleksji/"></g:plusone>
			</div>
			<div style="float:left; width:95px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://przemkovv.net/2007/08/03/mechanizm-refleksji/"  data-text="Mechanizm refleksji" data-count="horizontal" data-via="przemkovv">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://przemkovv.net/2007/08/03/mechanizm-refleksji/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

