<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>Wilko Waitz - .NET</title>
    <link>http://blog.waitz.biz/</link>
    <description>Es gibt keine perfekten Taten. Nur perfekte Absichten.&lt;br&gt;(Sylvia Plath)&lt;br&gt;
Der Weg in die Hölle ist gepflastert mit guten Absichten.&lt;br&gt;(Ben Sisko in DS Nine)</description>
    <language>en-us</language>
    <copyright>Wilko Waitz</copyright>
    <lastBuildDate>Sun, 20 Jan 2008 09:42:14 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.6264.0</generator>
    <managingEditor>info@wwaitz.de</managingEditor>
    <webMaster>info@wwaitz.de</webMaster>
    <item>
      <trackback:ping>http://blog.waitz.biz/Trackback.aspx?guid=0d6f8ed2-b0f1-41ec-a5c1-a9265a485f51</trackback:ping>
      <pingback:server>http://blog.waitz.biz/pingback.aspx</pingback:server>
      <pingback:target>http://blog.waitz.biz/PermaLink,guid,0d6f8ed2-b0f1-41ec-a5c1-a9265a485f51.aspx</pingback:target>
      <dc:creator>Wilko Waitz</dc:creator>
      <wfw:comment>http://blog.waitz.biz/CommentView,guid,0d6f8ed2-b0f1-41ec-a5c1-a9265a485f51.aspx</wfw:comment>
      <wfw:commentRss>http://blog.waitz.biz/SyndicationService.asmx/GetEntryCommentsRss?guid=0d6f8ed2-b0f1-41ec-a5c1-a9265a485f51</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Nachdem ich einen DC aufgesetzt habe, wollte
ich natürlich auch die vorhandenden (virtuellen) Maschinen in die Domain aufnehmen.
Bei Rechnern, welche mittels Installation von CD aufgesetzt wurden funktioniert dies
auch wunderbar. Bei virtuellen Maschinen deren Installation auf Basis eine Images,
ohne weitere Vorbereitungen/Maßnahmen, erfolgte, kommt es naturgemäß zu Problemen.
Die Rechner besitzen alle die gleiche SID und das mag der DC nun überhaupt nicht.<br /><br />
Also mit dem Tool <a href="http://blog.waitz.biz/ct.ashx?id=0d6f8ed2-b0f1-41ec-a5c1-a9265a485f51&amp;url=http%3a%2f%2fwww.microsoft.com%2fgermany%2ftechnet%2fsysinternals%2futilities%2fNewSid.mspx">NewSid</a> dem
Rechner eine SID verpasst und dann funktioniert es auch mit dem Aufnehmen in die Domain.
Soweit so gut.<br /><br />
Nach dem notwendigen Reboot und dem obligatorischen Blick in das Eventlog wird mir
fast schwarz vor Augen. Da lächelt mich doch diese (siehe Bild) schöne Fehlermeldung
an. Der Blick auf die Eigenschaften offenbarte mir folgenden Text:<br /><br /><i>Unable to get the private bytes memory limit for the W3WP process. The ASP.NET
cache will be unable to limit its memory use, which may lead to a process restart.<br /></i><br />
Was bedeutet das denn nun schon wieder? Nach einigen Ursachenforschungen kam dann
folgendes heraus; Natürlich hat sich auch die SID der Accounts geändert und das verursacht
beim IIS Probleme, da im konkreten Fall die Gruppe IIS_WPG nicht mehr die nötigen
Rechte auf die Applikationpools besitzt. Ist zwar komisch, da NETWORK SERVICE und
die anderen Accounts in der Metabase des IIS korrekt eingetragen wurden aber was solls,
dass klärt sich sicher auch noch auf. Abgesehen von den Leichen, die ehemaligen Accounts
mit nun "ungültiger" SID, sowie der fehlenden Gruppe waren die Einstellungen der IIS
Metabase korrekt.<br /><br />
Die Fehlerbehebung erfolgte dann in zwei Schritten. 
<br /><ol><li>
Entfernung der ungültigen Accounts aus der Metabase</li><li>
Hinzufügen von IIS_WPG mit den nötigen Rechten.</li></ol>
Beides kann mittels dem Script Metaacl.vbs durchgeführt werden. Der Aufruf zum Hinzufügen
von IIS_WPG sieht dann folgendermaßen aus:<br /><br /><i>cscript Metaacl.vbs "IIS://LocalHost/W3SVC/AppPools" &lt;RECHNER&gt;\IIS_WPG U</i><br /><br />
Das U steht für die zu setzenden Rechte, in diesem Fall für "Unsecure properties read"
und genau diese Einstellung ist nötig. Nach dieser Prozedur sah mein Eventlog, abgesehen
von den Problemen welche sich ergeben wenn ein installierter Team Foundation Server
in eine Domain gehoben wird, richtig gut aus. Doch dazu später mehr.<br /><p></p><img src="http://blog.waitz.biz/content/binary/event_error.GIF" border="0" /><img width="0" height="0" src="http://blog.waitz.biz/aggbug.ashx?id=0d6f8ed2-b0f1-41ec-a5c1-a9265a485f51" /></body>
      <title>Geklonte virtuelle Maschine in eine Domain aufnehmen.</title>
      <guid isPermaLink="false">http://blog.waitz.biz/PermaLink,guid,0d6f8ed2-b0f1-41ec-a5c1-a9265a485f51.aspx</guid>
      <link>http://blog.waitz.biz/2008/01/20/GeklonteVirtuelleMaschineInEineDomainAufnehmen.aspx</link>
      <pubDate>Sun, 20 Jan 2008 09:42:14 GMT</pubDate>
      <description>Nachdem ich einen DC aufgesetzt habe, wollte ich natürlich auch die vorhandenden (virtuellen) Maschinen in die Domain aufnehmen. Bei Rechnern, welche mittels Installation von CD aufgesetzt wurden funktioniert dies auch wunderbar. Bei virtuellen Maschinen deren Installation auf Basis eine Images, ohne weitere Vorbereitungen/Maßnahmen, erfolgte, kommt es naturgemäß zu Problemen. Die Rechner besitzen alle die gleiche SID und das mag der DC nun überhaupt nicht.&lt;br&gt;
&lt;br&gt;
Also mit dem Tool &lt;a href="http://blog.waitz.biz/ct.ashx?id=0d6f8ed2-b0f1-41ec-a5c1-a9265a485f51&amp;amp;url=http%3a%2f%2fwww.microsoft.com%2fgermany%2ftechnet%2fsysinternals%2futilities%2fNewSid.mspx"&gt;NewSid&lt;/a&gt; dem
Rechner eine SID verpasst und dann funktioniert es auch mit dem Aufnehmen in die Domain.
Soweit so gut.&lt;br&gt;
&lt;br&gt;
Nach dem notwendigen Reboot und dem obligatorischen Blick in das Eventlog wird mir
fast schwarz vor Augen. Da lächelt mich doch diese (siehe Bild) schöne Fehlermeldung
an. Der Blick auf die Eigenschaften offenbarte mir folgenden Text:&lt;br&gt;
&lt;br&gt;
&lt;i&gt;Unable to get the private bytes memory limit for the W3WP process. The ASP.NET
cache will be unable to limit its memory use, which may lead to a process restart.&lt;br&gt;
&lt;/i&gt;
&lt;br&gt;
Was bedeutet das denn nun schon wieder? Nach einigen Ursachenforschungen kam dann
folgendes heraus; Natürlich hat sich auch die SID der Accounts geändert und das verursacht
beim IIS Probleme, da im konkreten Fall die Gruppe IIS_WPG nicht mehr die nötigen
Rechte auf die Applikationpools besitzt. Ist zwar komisch, da NETWORK SERVICE und
die anderen Accounts in der Metabase des IIS korrekt eingetragen wurden aber was solls,
dass klärt sich sicher auch noch auf. Abgesehen von den Leichen, die ehemaligen Accounts
mit nun "ungültiger" SID, sowie der fehlenden Gruppe waren die Einstellungen der IIS
Metabase korrekt.&lt;br&gt;
&lt;br&gt;
Die Fehlerbehebung erfolgte dann in zwei Schritten. 
&lt;br&gt;
&lt;ol&gt;
&lt;li&gt;
Entfernung der ungültigen Accounts aus der Metabase&lt;/li&gt;
&lt;li&gt;
Hinzufügen von IIS_WPG mit den nötigen Rechten.&lt;/li&gt;
&lt;/ol&gt;
Beides kann mittels dem Script Metaacl.vbs durchgeführt werden. Der Aufruf zum Hinzufügen
von IIS_WPG sieht dann folgendermaßen aus:&lt;br&gt;
&lt;br&gt;
&lt;i&gt;cscript Metaacl.vbs "IIS://LocalHost/W3SVC/AppPools" &amp;lt;RECHNER&amp;gt;\IIS_WPG U&lt;/i&gt;
&lt;br&gt;
&lt;br&gt;
Das U steht für die zu setzenden Rechte, in diesem Fall für "Unsecure properties read"
und genau diese Einstellung ist nötig. Nach dieser Prozedur sah mein Eventlog, abgesehen
von den Problemen welche sich ergeben wenn ein installierter Team Foundation Server
in eine Domain gehoben wird, richtig gut aus. Doch dazu später mehr.&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img src="http://blog.waitz.biz/content/binary/event_error.GIF" border="0"&gt;&lt;img width="0" height="0" src="http://blog.waitz.biz/aggbug.ashx?id=0d6f8ed2-b0f1-41ec-a5c1-a9265a485f51" /&gt;</description>
      <comments>http://blog.waitz.biz/CommentView,guid,0d6f8ed2-b0f1-41ec-a5c1-a9265a485f51.aspx</comments>
      <category>.NET;Betriebssystem</category>
    </item>
    <item>
      <trackback:ping>http://blog.waitz.biz/Trackback.aspx?guid=f5b3e9a3-9bf7-4ff7-b69b-b5f8b3676992</trackback:ping>
      <pingback:server>http://blog.waitz.biz/pingback.aspx</pingback:server>
      <pingback:target>http://blog.waitz.biz/PermaLink,guid,f5b3e9a3-9bf7-4ff7-b69b-b5f8b3676992.aspx</pingback:target>
      <dc:creator>Wilko Waitz</dc:creator>
      <wfw:comment>http://blog.waitz.biz/CommentView,guid,f5b3e9a3-9bf7-4ff7-b69b-b5f8b3676992.aspx</wfw:comment>
      <wfw:commentRss>http://blog.waitz.biz/SyndicationService.asmx/GetEntryCommentsRss?guid=f5b3e9a3-9bf7-4ff7-b69b-b5f8b3676992</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <h3>Warum dieser Beitrag
</h3>
Exceptionhandling ist zum Teil eine Frage der Philosophie und der Einstellung. Einige
behandeln Ausnahmen überhaupt nicht und andere Verfahren nach der <i>catch all</i> Philosophie.
Beides ist suboptimal.<br /><br /><h3>Wie sieht vernünftige Ausnahmebehandlung aus
</h3>
Grundsätzlich verfahre ich immer nach folgendenden Merksätzen:<br /><br /><i>Merksatz 2.0<br />
Behandle nur Ausnahmen, welche du auch lösen kannst.<br /><br /></i>Dieses Verfahren gaukelt dem Benutzer einer Bibliothek nicht vor, dass sie sich
im Normbereich bewegt. Weiterhin kann er für seinen Anwendungsfall geeignete Lösungsstrategien
implementieren. Handelt es sich nicht um eine Bibliothek, sondern um das eigentliche
Programm, erleichtert es das Testen und das Ermitteln von Grenzbereichen, welches
dann wiederrum die Ableitung von geeigneten Lösungsstrategien ermöglicht. Sowohl für
die Bibliotheken als auch für die Anwendung.<br /><i><br />
Merksatz 2.1<br />
Ausnahmen sind bei der Entwicklung eines Produktes notwendig und willkommen. Sie verbessern
die Qualität des Produktes, wenn sie frühzeitig auftreten können/dürfen.</i><br /><br />
Macht eine Anwendung von Log-Mechanismen Gebrauch, so ist nichts dagegen einzuwenden,
wenn Codeblöcke existieren, welche der <i>catch all</i> Philosophie folgen, um die
Ausnahme zu protokollieren. Wichtig ist nur, dass der Fehler an übergeordnete Schichten
weitergeleitet wird. Hierzu ein Beispiel:<br /><br /><pre style="FONT-SIZE: 11px; FONT-FAMILY: Courier New"><span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">try</span><br />
{<br />
...<br />
}<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">catch</span>(
... )<br />
{<br />
...<br />
}<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">catch</span>(
Exception ex )<br />
{<br />
log.Error(<span style="FONT-SIZE: 11px; COLOR: rgb(102,102,102); FONT-FAMILY: Courier New; BACKGROUND-COLOR: rgb(228,228,228)">"Unbehandelte
Ausnahme"</span>, ex );<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">throw</span>;<br />
}</span><br /></pre><br /><p>
Im konkreten Beispiel wurde log4net verwendet. Wichtig für das Thema ist jedoch, das
der rethrow-Mechanismus von .NET verwendet wird.
</p><br /><h3>Wann sollen eigene Ausnahmen erzeugt werden
</h3>
Eigene Ausnahmen sind sinnvoll, wenn diese ausserhalb eines Exception-Blocks geworfen
werden. Sie testen beispielsweise ob die Parameter eines Methodenaufrufs innerhalb
eines gültigen Wertebereiches liegen. Dann können und sollten Sie bibliotheks- und
programmspezifische Ausnahmen werfen. Gern darf hier von vorhandenen Exceptions abgeleitet
werden. Im konkreten Fall und unter .NET von einer ArgumentException.<br /><br />
Das Erzeugen einer eigenen Ausnahme innerhalb eines Exceptionblocks sollte wohl überlegt
sein. Es erzeugt auf seiten des Nutzers zusätzlichen Aufwand, auslesen der InnerException,
und macht somit den Grund der Ausnahme nicht vollends klar. Es ermutigt den Entwickler,
die Programmsteuerung auf Basis von Ausnahmen vorzunehmen.<br /><br />
Sollte man sich dennoch für eigene Exceptiontypen innerhalb eines Exceptionblocks
entscheiden, so muß unbedingt die eigentliche Exception, als InnerException, weitergeleitet
werden. Andernfalls kann eine Fehlersuche sehr aufwändig werden.<br /><br /><h3>Fazit
</h3>
Die Ausnahmebehandlung ist ein wichtiger Bestandteil der Softwareentwicklung. Es bietet
sich an, zu Beginn des Entwicklungsprozesses, nur wenige Ausnahmen zu behandeln. Im
Verlauf der  Entwicklung, durch Testen, werden die Gründe für Fehler klarer und
können effektiver behandelt werden. Das Verstecken von  Fehlverhalten nützt niemanden
etwas, sondern führt zu nicht nachvollziehbaren Programmverhalten. Im schlechtesten
Fall nach der Auslieferung eines Produktes.<br /><br /><p></p><img width="0" height="0" src="http://blog.waitz.biz/aggbug.ashx?id=f5b3e9a3-9bf7-4ff7-b69b-b5f8b3676992" /></body>
      <title>Ein paar Gedanken zur Ausnahmebehandlung</title>
      <guid isPermaLink="false">http://blog.waitz.biz/PermaLink,guid,f5b3e9a3-9bf7-4ff7-b69b-b5f8b3676992.aspx</guid>
      <link>http://blog.waitz.biz/2007/03/02/EinPaarGedankenZurAusnahmebehandlung.aspx</link>
      <pubDate>Fri, 02 Mar 2007 15:33:31 GMT</pubDate>
      <description>&lt;h3&gt;Warum dieser Beitrag
&lt;/h3&gt;
Exceptionhandling ist zum Teil eine Frage der Philosophie und der Einstellung. Einige
behandeln Ausnahmen überhaupt nicht und andere Verfahren nach der &lt;i&gt;catch all&lt;/i&gt; Philosophie.
Beides ist suboptimal.&lt;br&gt;
&lt;br /&gt;
&lt;h3&gt;Wie sieht vernünftige Ausnahmebehandlung aus
&lt;/h3&gt;
Grundsätzlich verfahre ich immer nach folgendenden Merksätzen:&lt;br&gt;
&lt;br&gt;
&lt;i&gt;Merksatz 2.0&lt;br&gt;
Behandle nur Ausnahmen, welche du auch lösen kannst.&lt;br&gt;
&lt;br&gt;
&lt;/i&gt;Dieses Verfahren gaukelt dem Benutzer einer Bibliothek nicht vor, dass sie sich
im Normbereich bewegt. Weiterhin kann er für seinen Anwendungsfall geeignete Lösungsstrategien
implementieren. Handelt es sich nicht um eine Bibliothek, sondern um das eigentliche
Programm, erleichtert es das Testen und das Ermitteln von Grenzbereichen, welches
dann wiederrum die Ableitung von geeigneten Lösungsstrategien ermöglicht. Sowohl für
die Bibliotheken als auch für die Anwendung.&lt;br&gt;
&lt;i&gt;
&lt;br&gt;
Merksatz 2.1&lt;br&gt;
Ausnahmen sind bei der Entwicklung eines Produktes notwendig und willkommen. Sie verbessern
die Qualität des Produktes, wenn sie frühzeitig auftreten können/dürfen.&lt;/i&gt;
&lt;br&gt;
&lt;br&gt;
Macht eine Anwendung von Log-Mechanismen Gebrauch, so ist nichts dagegen einzuwenden,
wenn Codeblöcke existieren, welche der &lt;i&gt;catch all&lt;/i&gt; Philosophie folgen, um die
Ausnahme zu protokollieren. Wichtig ist nur, dass der Fehler an übergeordnete Schichten
weitergeleitet wird. Hierzu ein Beispiel:&lt;br&gt;
&lt;br&gt;
&lt;pre style="FONT-SIZE: 11px; FONT-FAMILY: Courier New"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;try&lt;/span&gt;
&lt;br&gt;
{&lt;br&gt;
...&lt;br&gt;
}&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;catch&lt;/span&gt;(
... )&lt;br&gt;
{&lt;br&gt;
...&lt;br&gt;
}&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;catch&lt;/span&gt;(
Exception ex )&lt;br&gt;
{&lt;br&gt;
log.Error(&lt;span style="FONT-SIZE: 11px; COLOR: rgb(102,102,102); FONT-FAMILY: Courier New; BACKGROUND-COLOR: rgb(228,228,228)"&gt;"Unbehandelte
Ausnahme"&lt;/span&gt;, ex );&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;throw&lt;/span&gt;;&lt;br&gt;
}&lt;/span&gt;
&lt;br&gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;p&gt;
Im konkreten Beispiel wurde log4net verwendet. Wichtig für das Thema ist jedoch, das
der rethrow-Mechanismus von .NET verwendet wird.
&lt;/p&gt;
&lt;br /&gt;
&lt;h3&gt;Wann sollen eigene Ausnahmen erzeugt werden
&lt;/h3&gt;
Eigene Ausnahmen sind sinnvoll, wenn diese ausserhalb eines Exception-Blocks geworfen
werden. Sie testen beispielsweise ob die Parameter eines Methodenaufrufs innerhalb
eines gültigen Wertebereiches liegen. Dann können und sollten Sie bibliotheks- und
programmspezifische Ausnahmen werfen. Gern darf hier von vorhandenen Exceptions abgeleitet
werden. Im konkreten Fall und unter .NET von einer ArgumentException.&lt;br&gt;
&lt;br&gt;
Das Erzeugen einer eigenen Ausnahme innerhalb eines Exceptionblocks sollte wohl überlegt
sein. Es erzeugt auf seiten des Nutzers zusätzlichen Aufwand, auslesen der InnerException,
und macht somit den Grund der Ausnahme nicht vollends klar. Es ermutigt den Entwickler,
die Programmsteuerung auf Basis von Ausnahmen vorzunehmen.&lt;br&gt;
&lt;br&gt;
Sollte man sich dennoch für eigene Exceptiontypen innerhalb eines Exceptionblocks
entscheiden, so muß unbedingt die eigentliche Exception, als InnerException, weitergeleitet
werden. Andernfalls kann eine Fehlersuche sehr aufwändig werden.&lt;br&gt;
&lt;br /&gt;
&lt;h3&gt;Fazit
&lt;/h3&gt;
Die Ausnahmebehandlung ist ein wichtiger Bestandteil der Softwareentwicklung. Es bietet
sich an, zu Beginn des Entwicklungsprozesses, nur wenige Ausnahmen zu behandeln. Im
Verlauf der&amp;nbsp; Entwicklung, durch Testen, werden die Gründe für Fehler klarer und
können effektiver behandelt werden. Das Verstecken von&amp;nbsp; Fehlverhalten nützt niemanden
etwas, sondern führt zu nicht nachvollziehbaren Programmverhalten. Im schlechtesten
Fall nach der Auslieferung eines Produktes.&lt;br&gt;
&lt;br /&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.waitz.biz/aggbug.ashx?id=f5b3e9a3-9bf7-4ff7-b69b-b5f8b3676992" /&gt;</description>
      <comments>http://blog.waitz.biz/CommentView,guid,f5b3e9a3-9bf7-4ff7-b69b-b5f8b3676992.aspx</comments>
      <category>.NET;Merksätze;Softwareentwicklung</category>
    </item>
    <item>
      <trackback:ping>http://blog.waitz.biz/Trackback.aspx?guid=d369202f-a36b-47f9-ac20-49e647a61320</trackback:ping>
      <pingback:server>http://blog.waitz.biz/pingback.aspx</pingback:server>
      <pingback:target>http://blog.waitz.biz/PermaLink,guid,d369202f-a36b-47f9-ac20-49e647a61320.aspx</pingback:target>
      <dc:creator>Wilko Waitz</dc:creator>
      <wfw:comment>http://blog.waitz.biz/CommentView,guid,d369202f-a36b-47f9-ac20-49e647a61320.aspx</wfw:comment>
      <wfw:commentRss>http://blog.waitz.biz/SyndicationService.asmx/GetEntryCommentsRss?guid=d369202f-a36b-47f9-ac20-49e647a61320</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Um NAnt mitzuteilen, welche Version des .NET Frameworks beim Kompilieren verwendet
werden soll, muss einfach nur das Property "nant.settings.currentframework" entsprechend
gesetzt werden. Sollen die Sourcen mit Framework 1.1 übersetzt werden, so ist im Buildscript
folgendes zu notieren:
</p>
        <br />
        <p>
          <font face="Courier New">&lt;property name="nant.settings.currentframework" value="net-1.1"
/&gt;</font>
        </p>
        <br />
        <p>
Das Framework kann allerdings auch über die Kommandozeile angegeben werden mittels:
</p>
        <br />
        <p>
          <font face="Courier New">nant.exe -t:net-1.1</font>
        </p>
        <img width="0" height="0" src="http://blog.waitz.biz/aggbug.ashx?id=d369202f-a36b-47f9-ac20-49e647a61320" />
      </body>
      <title>Setzen der Frameworkversion bei NAnt</title>
      <guid isPermaLink="false">http://blog.waitz.biz/PermaLink,guid,d369202f-a36b-47f9-ac20-49e647a61320.aspx</guid>
      <link>http://blog.waitz.biz/2007/01/11/SetzenDerFrameworkversionBeiNAnt.aspx</link>
      <pubDate>Thu, 11 Jan 2007 08:13:30 GMT</pubDate>
      <description>&lt;p&gt;
Um NAnt mitzuteilen, welche Version des .NET Frameworks beim Kompilieren verwendet
werden soll, muss einfach nur das Property "nant.settings.currentframework" entsprechend
gesetzt werden. Sollen die Sourcen mit Framework 1.1 übersetzt werden, so ist im Buildscript
folgendes zu notieren:
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;&amp;lt;property name="nant.settings.currentframework" value="net-1.1"
/&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;
Das Framework kann allerdings auch über die Kommandozeile angegeben werden mittels:
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;nant.exe -t:net-1.1&lt;/font&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.waitz.biz/aggbug.ashx?id=d369202f-a36b-47f9-ac20-49e647a61320" /&gt;</description>
      <comments>http://blog.waitz.biz/CommentView,guid,d369202f-a36b-47f9-ac20-49e647a61320.aspx</comments>
      <category>.NET;Tools</category>
    </item>
    <item>
      <trackback:ping>http://blog.waitz.biz/Trackback.aspx?guid=ebb99b90-9954-44f2-ab39-8d87a4bf5099</trackback:ping>
      <pingback:server>http://blog.waitz.biz/pingback.aspx</pingback:server>
      <pingback:target>http://blog.waitz.biz/PermaLink,guid,ebb99b90-9954-44f2-ab39-8d87a4bf5099.aspx</pingback:target>
      <dc:creator>Wilko Waitz</dc:creator>
      <wfw:comment>http://blog.waitz.biz/CommentView,guid,ebb99b90-9954-44f2-ab39-8d87a4bf5099.aspx</wfw:comment>
      <wfw:commentRss>http://blog.waitz.biz/SyndicationService.asmx/GetEntryCommentsRss?guid=ebb99b90-9954-44f2-ab39-8d87a4bf5099</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <a href="http://blog.waitz.biz/ct.ashx?id=ebb99b90-9954-44f2-ab39-8d87a4bf5099&amp;url=http%3a%2f%2fwww.ksamaschke.de">Karsten
Samaschke</a> ruft mit dem Portal <a href="http://blog.waitz.biz/ct.ashx?id=ebb99b90-9954-44f2-ab39-8d87a4bf5099&amp;url=http%3a%2f%2fwww.aspxperts.de">ASPXperts</a> eine
Community ins Leben, welche sich u.a. mit den Themen ASP.NET, XML und XML-Webdienste
beschäftigt. Ein Bereich, welcher mich persönlich sehr interessiert, ist die Software-Architektur.<br /><br />
Es wird immer wichtiger, seinen Projekten eine strukturierte und durchdachte Architektur
zu Grunde zu legen. Häufige Anforderungsänderungen können in Projekten ohne klar definierte
Architektur schnell zu Chaos führen. Deshalb fällt es mir sehr positiv auf, dass ASPXperts
diesem Thema einen eigenen Bereich spendiert.<br /><br />
Erwartungsgemäß sind derzeit wenige Inhalte zu finden, das Projekt befindet sich in
der Enstehungsphase. Mit der Zeit werden sicher interessante und lehrreiche Beiträge
aufschlagen.<br /><br />
Ich für meinen Teil habe mich heute registriert.<br /><p></p><img width="0" height="0" src="http://blog.waitz.biz/aggbug.ashx?id=ebb99b90-9954-44f2-ab39-8d87a4bf5099" /></body>
      <title>Portal für Softwareentwicklung</title>
      <guid isPermaLink="false">http://blog.waitz.biz/PermaLink,guid,ebb99b90-9954-44f2-ab39-8d87a4bf5099.aspx</guid>
      <link>http://blog.waitz.biz/2007/01/09/PortalF%c3%bcrSoftwareentwicklung.aspx</link>
      <pubDate>Tue, 09 Jan 2007 10:42:38 GMT</pubDate>
      <description>&lt;a href="http://blog.waitz.biz/ct.ashx?id=ebb99b90-9954-44f2-ab39-8d87a4bf5099&amp;amp;url=http%3a%2f%2fwww.ksamaschke.de"&gt;Karsten
Samaschke&lt;/a&gt; ruft mit dem Portal &lt;a href="http://blog.waitz.biz/ct.ashx?id=ebb99b90-9954-44f2-ab39-8d87a4bf5099&amp;amp;url=http%3a%2f%2fwww.aspxperts.de"&gt;ASPXperts&lt;/a&gt; eine
Community ins Leben, welche sich u.a. mit den Themen ASP.NET, XML und XML-Webdienste
beschäftigt. Ein Bereich, welcher mich persönlich sehr interessiert, ist die Software-Architektur.&lt;br&gt;
&lt;br&gt;
Es wird immer wichtiger, seinen Projekten eine strukturierte und durchdachte Architektur
zu Grunde zu legen. Häufige Anforderungsänderungen können in Projekten ohne klar definierte
Architektur schnell zu Chaos führen. Deshalb fällt es mir sehr positiv auf, dass ASPXperts
diesem Thema einen eigenen Bereich spendiert.&lt;br&gt;
&lt;br&gt;
Erwartungsgemäß sind derzeit wenige Inhalte zu finden, das Projekt befindet sich in
der Enstehungsphase. Mit der Zeit werden sicher interessante und lehrreiche Beiträge
aufschlagen.&lt;br&gt;
&lt;br&gt;
Ich für meinen Teil habe mich heute registriert.&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.waitz.biz/aggbug.ashx?id=ebb99b90-9954-44f2-ab39-8d87a4bf5099" /&gt;</description>
      <comments>http://blog.waitz.biz/CommentView,guid,ebb99b90-9954-44f2-ab39-8d87a4bf5099.aspx</comments>
      <category>.NET;Netzwelt;Softwareentwicklung</category>
    </item>
    <item>
      <trackback:ping>http://blog.waitz.biz/Trackback.aspx?guid=85edafe3-9025-4ecc-91f2-1c5f0a8c0c3d</trackback:ping>
      <pingback:server>http://blog.waitz.biz/pingback.aspx</pingback:server>
      <pingback:target>http://blog.waitz.biz/PermaLink,guid,85edafe3-9025-4ecc-91f2-1c5f0a8c0c3d.aspx</pingback:target>
      <dc:creator>Wilko Waitz</dc:creator>
      <wfw:comment>http://blog.waitz.biz/CommentView,guid,85edafe3-9025-4ecc-91f2-1c5f0a8c0c3d.aspx</wfw:comment>
      <wfw:commentRss>http://blog.waitz.biz/SyndicationService.asmx/GetEntryCommentsRss?guid=85edafe3-9025-4ecc-91f2-1c5f0a8c0c3d</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Wenn eine ConfigSection mittels 
</p>
        <br />
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">System.Configuration.ConfigurationManager.GetSection(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"section"</span>)</span>
        </p>
        <br />
        <p>
eingelesen wird, ruft .NET den für die Section angegebenen Handler auf. Der Handler,
welcher vom Typ <em>IConfigurationSectionHandler</em> ist, gibt lt. Schnittstelle
ein Objekt vom Typ <em>object</em> zurück. Soweit so gut. 
</p>
        <br />
        <p>
Wer nun denkt, das beim nochmaligen Aufruf von <em>ConfigurationManager.GetSection(...)</em> der
Handler wiederholt aufgerufen wird, liegt falsch. Der ConfigurationManager gibt das
selbe Objekt wie beim ersten Aufruf zurück. Man sollte vermeiden, irgendwelche Verlaufsdaten
in diesem Konfigurationsobjekt abzulegen. Es kann sonst passieren das Daten ungewollt,
über Sessions hinweg, gemeinsam genutzt werden.
</p>
        <br />
        <p>
          <em>Merksatz 1.0:<br />
Die Section dient der Konfiguration von Geschäftsklassen und ist nicht selbst die
Geschäftsklasse. </em>
          <img alt=":-)" src="smilies/happy.gif" />
        </p>
        <img width="0" height="0" src="http://blog.waitz.biz/aggbug.ashx?id=85edafe3-9025-4ecc-91f2-1c5f0a8c0c3d" />
      </body>
      <title>Einlesen eines Konfigurationsbereiches</title>
      <guid isPermaLink="false">http://blog.waitz.biz/PermaLink,guid,85edafe3-9025-4ecc-91f2-1c5f0a8c0c3d.aspx</guid>
      <link>http://blog.waitz.biz/2007/01/08/EinlesenEinesKonfigurationsbereiches.aspx</link>
      <pubDate>Mon, 08 Jan 2007 08:51:05 GMT</pubDate>
      <description>&lt;p&gt;
Wenn eine ConfigSection mittels 
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;System.Configuration.ConfigurationManager.GetSection(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"section"&lt;/span&gt;)&lt;/span&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;
eingelesen wird, ruft .NET den für die Section angegebenen Handler auf. Der Handler,
welcher vom Typ&amp;nbsp;&lt;em&gt;IConfigurationSectionHandler&lt;/em&gt; ist, gibt lt. Schnittstelle
ein Objekt vom Typ &lt;em&gt;object&lt;/em&gt; zurück. Soweit so gut. 
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;
Wer nun denkt, das beim nochmaligen Aufruf von &lt;em&gt;ConfigurationManager.GetSection(...)&lt;/em&gt; der
Handler wiederholt aufgerufen wird, liegt falsch. Der ConfigurationManager gibt das
selbe Objekt wie beim ersten Aufruf zurück. Man sollte vermeiden, irgendwelche Verlaufsdaten
in diesem Konfigurationsobjekt abzulegen. Es kann sonst passieren das Daten ungewollt,
über Sessions hinweg, gemeinsam genutzt&amp;nbsp;werden.
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;
&lt;em&gt;Merksatz 1.0:&lt;br&gt;
Die Section dient der Konfiguration von Geschäftsklassen und ist nicht selbst&amp;nbsp;die
Geschäftsklasse. &lt;/em&gt;&lt;img alt=":-)" src="smilies/happy.gif"&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.waitz.biz/aggbug.ashx?id=85edafe3-9025-4ecc-91f2-1c5f0a8c0c3d" /&gt;</description>
      <comments>http://blog.waitz.biz/CommentView,guid,85edafe3-9025-4ecc-91f2-1c5f0a8c0c3d.aspx</comments>
      <category>.NET;Merksätze</category>
    </item>
    <item>
      <trackback:ping>http://blog.waitz.biz/Trackback.aspx?guid=7d3b665a-e6c7-48cf-8f7d-2d45529bb1b7</trackback:ping>
      <pingback:server>http://blog.waitz.biz/pingback.aspx</pingback:server>
      <pingback:target>http://blog.waitz.biz/PermaLink,guid,7d3b665a-e6c7-48cf-8f7d-2d45529bb1b7.aspx</pingback:target>
      <dc:creator>Wilko Waitz</dc:creator>
      <wfw:comment>http://blog.waitz.biz/CommentView,guid,7d3b665a-e6c7-48cf-8f7d-2d45529bb1b7.aspx</wfw:comment>
      <wfw:commentRss>http://blog.waitz.biz/SyndicationService.asmx/GetEntryCommentsRss?guid=7d3b665a-e6c7-48cf-8f7d-2d45529bb1b7</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Wie versprochen nun die Fortsetzung.<br /><br />
Um "beliebige" Objekte lesen und schreiben zu können, bediene ich mich der Serialisierungmöglichkeiten
von .NET. Es werden zwei neue Methoden eingeführt <i>GetObject&lt;T&gt;</i> und <i>SetObject&lt;T&gt;</i>.
Die Implementierung dieser Methoden sieht dann wie folgt aus.<br /><br /><pre style="font-size: 11px; font-family: Courier New;"><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
&lt;summary&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
Gets the object.</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;/summary&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;param name="node"&gt;The node.&lt;/param&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;returns&gt;&lt;/returns&gt;</span><br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">private</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">static</span> T
GetObject&lt;T&gt;(XmlNode node)<br />
{<br />
T result <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">default</span>(T);<br /><br />
    <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//restore
object from node</span><br />
XmlSerializer ser <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> XmlSerializer(<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">typeof</span>(T));<br />
result <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> (T)ser.Deserialize(<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> StringReader(node.OuterXml));<br /><br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span> result;<br />
}<br /><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;summary&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
Sets the object.</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;/summary&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;param name="node"&gt;The node.&lt;/param&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;param name="value"&gt;The value.&lt;/param&gt;</span><br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">private</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">static</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> SetObject&lt;T&gt;(XmlNode
node, T value)<br />
{<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span>(value
== <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">null</span>)<br />
{<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span>;<br />
}<br /><br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">using</span>(MemoryStream
stream <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> MemoryStream())<br />
{<br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//serialize
object</span><br />
XmlSerializer ser <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> XmlSerializer(<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">typeof</span>(T));<br />
ser.Serialize(stream, value);<br /><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//reset
read position</span><br />
stream.Position <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 0;<br /><br />
XmlElement newNode <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">null</span>;<br /><br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">using</span>(XmlReader
reader <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> XmlReader.Create(stream))<br />
{<br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//move
to the content node.</span><br />
reader.MoveToContent();<br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//create
new element in node context</span><br />
newNode <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> node.OwnerDocument.CreateElement(reader.Name);<br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//set
content </span><br />
newNode.InnerXml <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> reader.ReadInnerXml();<br />
}<br /><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//append
the new node</span><br />
node.AppendChild(newNode);<br />
}<br />
}<br /></span></pre>
Die beiden Methoden können natürlich auch <i>public</i> gemacht werden, damit sie
explizit aufgerufen werden können. Diese Variante ist im Falle einer reinen Hilfsklasse
für unterschiedlichste Projekte in der Tat auch vorzuziehen, da es die Verwendungsmöglichkeiten
besser hervorhebt. 
<br /><br />
Im konkreten Beispiel habe ich sie einfach als zusätzlichen Aufruf in die Methoden <i>SetValue&lt;T&gt;</i> und <i>GetValue&lt;T&gt;</i> eingebaut.
Irgendwie muß ich ja mein Versprechen erfüllen, mich von der IConvertible-Schnittstelle
zu trennen. Nun noch kurz die geänderten Bereiche obiger Methoden, dann sollte ich
meiner Verpflichtung nachgekommen sein. <img alt=":-)" src="smilies/happy.gif" /><br /><br /><pre style="font-size: 11px; font-family: Courier New;"><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">static</span> T
GetValue&lt;T&gt;(XmlNode node, T @<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">default</span>)<br />
{<br />
    ...<br />
    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span>(!IsConvertible(<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">typeof</span>(T)))<br />
    {<br />
        <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//get
complex object</span><br />
        result <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> GetObject&lt;T&gt;(node);<br />
        result <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> result
!<span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">null</span> ?
result : @<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">default</span>;<br />
    }<br />
    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">else</span><br />
    {<br />
        ...<br />
    }<br />
    ...<br />
}<br /><br /></span><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">static</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> SetValue&lt;T&gt;(XmlNode
node, T value)<br />
{<br />
    ...<br />
    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span>(!IsConvertible(<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">typeof</span>(T)))<br />
    {<br />
        SetObject&lt;T&gt;(node, value);<br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span>;<br />
    }<br />
    ...<br />
}</span><br /></pre>
Diese Lösung ist ganz klar ein erster Ansatz. Sie weist in dieser Ausprägung noch
einige Lücken auf, welche ich nicht verschweigen möchte.<br /><ul><li>
Das Löschen von Objektknoten ist in dieser Variante nicht möglich</li><li>
Das Setzen eines komplexen Objektes führt immer zu einem anfügen. Durch die nicht
vorhandene Objektidentität wird bei mehrfachen Aufrufen das Objekt auch mehrfach hinzugefügt.</li><li>
Das unterschiedliche Verhalten von Lesen und Schreiben kann zu Irritationen führen.</li><li>
Die XML-Serialisierung kann unter Umständen nicht erfolgreich sein, was dann einige
Anforderungen an die Klassen stellt, um dies dennoch zu ermöglichen.<br /></li></ul><br /><p></p><img width="0" height="0" src="http://blog.waitz.biz/aggbug.ashx?id=7d3b665a-e6c7-48cf-8f7d-2d45529bb1b7" /></body>
      <title>Auslesen von XML-Knoten II</title>
      <guid isPermaLink="false">http://blog.waitz.biz/PermaLink,guid,7d3b665a-e6c7-48cf-8f7d-2d45529bb1b7.aspx</guid>
      <link>http://blog.waitz.biz/2006/12/12/AuslesenVonXMLKnotenII.aspx</link>
      <pubDate>Tue, 12 Dec 2006 18:25:27 GMT</pubDate>
      <description>Wie versprochen nun die Fortsetzung.&lt;br&gt;
&lt;br&gt;
Um "beliebige" Objekte lesen und schreiben zu können, bediene ich mich der Serialisierungmöglichkeiten
von .NET. Es werden zwei neue Methoden eingeführt &lt;i&gt;GetObject&amp;lt;T&amp;gt;&lt;/i&gt; und &lt;i&gt;SetObject&amp;lt;T&amp;gt;&lt;/i&gt;.
Die Implementierung dieser Methoden sieht dann wie folgt aus.&lt;br&gt;
&lt;br&gt;
&lt;pre style="font-size: 11px; font-family: Courier New;"&gt;&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
&amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
Gets the object.&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;param name="node"&amp;gt;The node.&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;static&lt;/span&gt; T
GetObject&amp;lt;T&amp;gt;(XmlNode node)&lt;br&gt;
{&lt;br&gt;
T result &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;default&lt;/span&gt;(T);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//restore
object from node&lt;/span&gt;
&lt;br&gt;
XmlSerializer ser &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; XmlSerializer(&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;typeof&lt;/span&gt;(T));&lt;br&gt;
result &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; (T)ser.Deserialize(&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; StringReader(node.OuterXml));&lt;br&gt;
&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; result;&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
Sets the object.&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;param name="node"&amp;gt;The node.&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;param name="value"&amp;gt;The value.&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;void&lt;/span&gt; SetObject&amp;lt;T&amp;gt;(XmlNode
node, T value)&lt;br&gt;
{&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt;(value
== &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;null&lt;/span&gt;)&lt;br&gt;
{&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt;;&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;using&lt;/span&gt;(MemoryStream
stream &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; MemoryStream())&lt;br&gt;
{&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//serialize
object&lt;/span&gt;
&lt;br&gt;
XmlSerializer ser &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; XmlSerializer(&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;typeof&lt;/span&gt;(T));&lt;br&gt;
ser.Serialize(stream, value);&lt;br&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//reset
read position&lt;/span&gt;
&lt;br&gt;
stream.Position &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;&lt;br&gt;
&lt;br&gt;
XmlElement newNode &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;null&lt;/span&gt;;&lt;br&gt;
&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;using&lt;/span&gt;(XmlReader
reader &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; XmlReader.Create(stream))&lt;br&gt;
{&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//move
to the content node.&lt;/span&gt;
&lt;br&gt;
reader.MoveToContent();&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//create
new element in node context&lt;/span&gt;
&lt;br&gt;
newNode &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; node.OwnerDocument.CreateElement(reader.Name);&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//set
content &lt;/span&gt;
&lt;br&gt;
newNode.InnerXml &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; reader.ReadInnerXml();&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//append
the new node&lt;/span&gt;
&lt;br&gt;
node.AppendChild(newNode);&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;&lt;/pre&gt;
Die beiden Methoden können natürlich auch &lt;i&gt;public&lt;/i&gt; gemacht werden, damit sie
explizit aufgerufen werden können. Diese Variante ist im Falle einer reinen Hilfsklasse
für unterschiedlichste Projekte in der Tat auch vorzuziehen, da es die Verwendungsmöglichkeiten
besser hervorhebt. 
&lt;br&gt;
&lt;br&gt;
Im konkreten Beispiel habe ich sie einfach als zusätzlichen Aufruf in die Methoden &lt;i&gt;SetValue&amp;lt;T&amp;gt;&lt;/i&gt; und &lt;i&gt;GetValue&amp;lt;T&amp;gt;&lt;/i&gt; eingebaut.
Irgendwie muß ich ja mein Versprechen erfüllen, mich von der IConvertible-Schnittstelle
zu trennen. Nun noch kurz die geänderten Bereiche obiger Methoden, dann sollte ich
meiner Verpflichtung nachgekommen sein. &lt;img alt=":-)" src="smilies/happy.gif"&gt;
&lt;br&gt;
&lt;br&gt;
&lt;pre style="font-size: 11px; font-family: Courier New;"&gt;&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;static&lt;/span&gt; T
GetValue&amp;lt;T&amp;gt;(XmlNode node, T @&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;default&lt;/span&gt;)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt;(!IsConvertible(&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;typeof&lt;/span&gt;(T)))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//get
complex object&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; GetObject&amp;lt;T&amp;gt;(node);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; result
!&lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;null&lt;/span&gt; ?
result : @&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;default&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;else&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;void&lt;/span&gt; SetValue&amp;lt;T&amp;gt;(XmlNode
node, T value)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt;(!IsConvertible(&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;typeof&lt;/span&gt;(T)))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetObject&amp;lt;T&amp;gt;(node, value);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br&gt;
}&lt;/span&gt;
&lt;br&gt;
&lt;/pre&gt;
Diese Lösung ist ganz klar ein erster Ansatz. Sie weist in dieser Ausprägung noch
einige Lücken auf, welche ich nicht verschweigen möchte.&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;
Das Löschen von Objektknoten ist in dieser Variante nicht möglich&lt;/li&gt;
&lt;li&gt;
Das Setzen eines komplexen Objektes führt immer zu einem anfügen. Durch die nicht
vorhandene Objektidentität wird bei mehrfachen Aufrufen das Objekt auch mehrfach hinzugefügt.&lt;/li&gt;
&lt;li&gt;
Das unterschiedliche Verhalten von Lesen und Schreiben kann zu Irritationen führen.&lt;/li&gt;
&lt;li&gt;
Die XML-Serialisierung kann unter Umständen nicht erfolgreich sein, was dann einige
Anforderungen an die Klassen stellt, um dies dennoch zu ermöglichen.&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.waitz.biz/aggbug.ashx?id=7d3b665a-e6c7-48cf-8f7d-2d45529bb1b7" /&gt;</description>
      <comments>http://blog.waitz.biz/CommentView,guid,7d3b665a-e6c7-48cf-8f7d-2d45529bb1b7.aspx</comments>
      <category>.NET;Snippets</category>
    </item>
    <item>
      <trackback:ping>http://blog.waitz.biz/Trackback.aspx?guid=4c64dff7-badf-46e5-a9a4-2eac9d463bf1</trackback:ping>
      <pingback:server>http://blog.waitz.biz/pingback.aspx</pingback:server>
      <pingback:target>http://blog.waitz.biz/PermaLink,guid,4c64dff7-badf-46e5-a9a4-2eac9d463bf1.aspx</pingback:target>
      <dc:creator>Wilko Waitz</dc:creator>
      <wfw:comment>http://blog.waitz.biz/CommentView,guid,4c64dff7-badf-46e5-a9a4-2eac9d463bf1.aspx</wfw:comment>
      <wfw:commentRss>http://blog.waitz.biz/SyndicationService.asmx/GetEntryCommentsRss?guid=4c64dff7-badf-46e5-a9a4-2eac9d463bf1</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Es ist wirklich interessant welches Laufzeitverhalten
.NET beim Vergleichen von Strings zeigt.<br /><br />
Die statische Methode <i>CompareOrdinal</i> des Typs String war, in einem nicht repräsentativen
Test, <b>13mal</b> schneller als <strike>sein Bruder</strike> seine Schwester <i>Compare</i>,
wenn für Compare keine explizite <i>StringComparison</i> angegeben ist. Mit <i>StringComparison.Ordinal</i> lässt
sich dann auch <i>Compare</i> dazu überreden, einen schnellen Vergleich durchzuführen. 
<br />
Leider bezahlt man die verbesserte Performance durch den Verlust der Kulturabhängigkeit.
Diese wird jedoch nicht für alle Strings zwingend benötigt.<br /><br /><b>Achtung</b>: CompareTo ist zwar etwas besser als Compare, mit einem Faktor von
11 aber nicht wesentlich performanter.<br /><img width="0" height="0" src="http://blog.waitz.biz/aggbug.ashx?id=4c64dff7-badf-46e5-a9a4-2eac9d463bf1" /></body>
      <title>Vergleichen von Zeichenketten</title>
      <guid isPermaLink="false">http://blog.waitz.biz/PermaLink,guid,4c64dff7-badf-46e5-a9a4-2eac9d463bf1.aspx</guid>
      <link>http://blog.waitz.biz/2006/12/11/VergleichenVonZeichenketten.aspx</link>
      <pubDate>Mon, 11 Dec 2006 19:59:19 GMT</pubDate>
      <description>Es ist wirklich interessant welches Laufzeitverhalten .NET beim Vergleichen von Strings zeigt.&lt;br&gt;
&lt;br&gt;
Die statische Methode &lt;i&gt;CompareOrdinal&lt;/i&gt; des Typs String war, in einem nicht repräsentativen
Test, &lt;b&gt;13mal&lt;/b&gt; schneller als &lt;strike&gt;sein Bruder&lt;/strike&gt; seine Schwester &lt;i&gt;Compare&lt;/i&gt;,
wenn für Compare keine explizite &lt;i&gt;StringComparison&lt;/i&gt; angegeben ist. Mit &lt;i&gt;StringComparison.Ordinal&lt;/i&gt; lässt
sich dann auch &lt;i&gt;Compare&lt;/i&gt; dazu überreden, einen schnellen Vergleich durchzuführen. 
&lt;br&gt;
Leider bezahlt man die verbesserte Performance durch den Verlust der Kulturabhängigkeit.
Diese wird jedoch nicht für alle Strings zwingend benötigt.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Achtung&lt;/b&gt;: CompareTo ist zwar etwas besser als Compare, mit einem Faktor von
11 aber nicht wesentlich performanter.&lt;br&gt;
&lt;img width="0" height="0" src="http://blog.waitz.biz/aggbug.ashx?id=4c64dff7-badf-46e5-a9a4-2eac9d463bf1" /&gt;</description>
      <comments>http://blog.waitz.biz/CommentView,guid,4c64dff7-badf-46e5-a9a4-2eac9d463bf1.aspx</comments>
      <category>.NET;Internals</category>
    </item>
    <item>
      <trackback:ping>http://blog.waitz.biz/Trackback.aspx?guid=1c1e9be0-9827-4e53-aa7a-a97d917c933e</trackback:ping>
      <pingback:server>http://blog.waitz.biz/pingback.aspx</pingback:server>
      <pingback:target>http://blog.waitz.biz/PermaLink,guid,1c1e9be0-9827-4e53-aa7a-a97d917c933e.aspx</pingback:target>
      <dc:creator>Wilko Waitz</dc:creator>
      <wfw:comment>http://blog.waitz.biz/CommentView,guid,1c1e9be0-9827-4e53-aa7a-a97d917c933e.aspx</wfw:comment>
      <wfw:commentRss>http://blog.waitz.biz/SyndicationService.asmx/GetEntryCommentsRss?guid=1c1e9be0-9827-4e53-aa7a-a97d917c933e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Nachdem mich am Donnerstag ein Virus dahin gerafft hat und ich das Bett hüten durfte,
soll es heute wieder was neues geben.
</p>
        <br />
        <p>
Häufig hat man es mit XML-Daten zu tun, welche ausgelesen und bearbeitet werden sollen.
Die enthaltenen Daten sind oft von einem bestimmten Typ. Die nachfolgende Hilfsklasse
stellt Schnittstellen zur Verfügung, um die notwendigen Typumwandlungen zu kapseln.
Diese Variante funktioniert nur mit Typen welche IConvertible implementieren. Eine
Erweiterung, welche diese Einschränkung nicht besitzt, gibt es morgen. :)
</p>
        <pre style="FONT-SIZE: 11px; FONT-FAMILY: Courier New">
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Xml;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System;<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">namespace</span> de.wwaitz.Utils.XmlHelper<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> NodeHelper<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
&lt;summary&gt;</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
Gets a value indicating whether T is convertible.</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
&lt;/summary&gt;</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
&lt;value&gt;</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
    &lt;c&gt;true&lt;/c&gt; if T is convertible; otherwise, &lt;c&gt;false&lt;/c&gt;.</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
&lt;/value&gt;</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">static</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">bool</span> IsConvertible(Type
resultType)<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">typeof</span>(IConvertible).IsAssignableFrom(resultType);<br />
}<br /><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
&lt;summary&gt;</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
Gets the value.</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
&lt;/summary&gt;</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
&lt;param name="node"&gt;The node.&lt;/param&gt;</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
&lt;param name="@default"&gt;The @default.&lt;/param&gt;</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
&lt;returns&gt;&lt;/returns&gt;</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">static</span> T
GetValue&lt;T&gt;(XmlNode node, T @<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">default</span>)<br />
{<br />
T result <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> @<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">default</span>;<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span>(node
== <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>)
{<br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//invalid
node</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> result;<br />
}<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span>(!IsConvertible(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">typeof</span>(T)))
{<br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//cast
is not possible</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> result;<br />
}<br /><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//get
value</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> toGet <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> node.InnerText;<br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//convert
to T</span><br />
result <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> (T)Convert.ChangeType(toGet, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">typeof</span>(T));<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> result;<br />
}<br /><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
&lt;summary&gt;</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
Sets the value.</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
&lt;/summary&gt;</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
&lt;param name="node"&gt;The node.&lt;/param&gt;</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
&lt;param name="value"&gt;The value.&lt;/param&gt;</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">static</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> SetValue&lt;T&gt;(XmlNode
node, T value)<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span>(node
== <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>)
{<br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//invalid
node</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span>;<br />
}<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span>(!IsConvertible(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">typeof</span>(T)))
{<br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//cast
is not possible</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span>;<br />
}<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> toSet <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> Convert.ToString(value);<br />
node.InnerText <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> toSet;<br />
}<br />
}<br />
}<br /></span>
        </pre>
        <br />
        <p>
Die Verwendung könnte dann wie folgt aussehen:
</p>
        <pre style="FONT-SIZE: 11px; FONT-FAMILY: Courier New">
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">internal</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> Program<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">private</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">static</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> Main(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span>[]
args)<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> xml <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: rgb(102,102,102); FONT-FAMILY: Courier New; BACKGROUND-COLOR: rgb(228,228,228)">"&lt;root&gt;&lt;my-bool&gt;true&lt;/my-bool&gt;&lt;/root&gt;"</span>;<br />
XmlDocument doc <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> XmlDocument();<br />
doc.LoadXml(xml);<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">bool</span> myBool <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> NodeHelper.GetValue&lt;<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">bool</span>&gt;(doc.DocumentElement[<span style="FONT-SIZE: 11px; COLOR: rgb(102,102,102); FONT-FAMILY: Courier New; BACKGROUND-COLOR: rgb(228,228,228)">"my-bool"</span>], <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">false</span>);<br />
NodeHelper.SetValue&lt;<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">bool</span>&gt;(doc.DocumentElement[<span style="FONT-SIZE: 11px; COLOR: rgb(102,102,102); FONT-FAMILY: Courier New; BACKGROUND-COLOR: rgb(228,228,228)">"my-bool"</span>],
!myBool);<br />
}<br />
}</span>
        </pre>
        <img width="0" height="0" src="http://blog.waitz.biz/aggbug.ashx?id=1c1e9be0-9827-4e53-aa7a-a97d917c933e" />
      </body>
      <title>Auslesen von XML-Knoten</title>
      <guid isPermaLink="false">http://blog.waitz.biz/PermaLink,guid,1c1e9be0-9827-4e53-aa7a-a97d917c933e.aspx</guid>
      <link>http://blog.waitz.biz/2006/12/11/AuslesenVonXMLKnoten.aspx</link>
      <pubDate>Mon, 11 Dec 2006 09:26:23 GMT</pubDate>
      <description>&lt;p&gt;
Nachdem mich am Donnerstag ein Virus dahin gerafft hat und ich das Bett hüten durfte,
soll es heute wieder was neues geben.
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;
Häufig hat man es mit XML-Daten zu tun, welche ausgelesen und bearbeitet werden sollen.
Die enthaltenen Daten sind oft von einem bestimmten Typ. Die nachfolgende Hilfsklasse
stellt Schnittstellen zur Verfügung, um die notwendigen Typumwandlungen zu kapseln.
Diese Variante funktioniert nur mit Typen welche IConvertible implementieren. Eine
Erweiterung, welche diese Einschränkung nicht besitzt, gibt es morgen. :)
&lt;/p&gt;
&lt;pre style="FONT-SIZE: 11px; FONT-FAMILY: Courier New"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Xml;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System;&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;namespace&lt;/span&gt; de.wwaitz.Utils.XmlHelper&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; NodeHelper&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
Gets a value indicating whether T is convertible.&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
&amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
&amp;lt;value&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;c&amp;gt;true&amp;lt;/c&amp;gt; if T is convertible; otherwise, &amp;lt;c&amp;gt;false&amp;lt;/c&amp;gt;.&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
&amp;lt;/value&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;static&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bool&lt;/span&gt; IsConvertible(Type
resultType)&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;typeof&lt;/span&gt;(IConvertible).IsAssignableFrom(resultType);&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
Gets the value.&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
&amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
&amp;lt;param name="node"&amp;gt;The node.&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
&amp;lt;param name="@default"&amp;gt;The @default.&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;static&lt;/span&gt; T
GetValue&amp;lt;T&amp;gt;(XmlNode node, T @&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;default&lt;/span&gt;)&lt;br&gt;
{&lt;br&gt;
T result &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; @&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;default&lt;/span&gt;;&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt;(node
== &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;)
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//invalid
node&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; result;&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt;(!IsConvertible(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;typeof&lt;/span&gt;(T)))
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//cast
is not possible&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; result;&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//get
value&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; toGet &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; node.InnerText;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//convert
to T&lt;/span&gt;
&lt;br&gt;
result &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; (T)Convert.ChangeType(toGet, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;typeof&lt;/span&gt;(T));&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; result;&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
Sets the value.&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
&amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
&amp;lt;param name="node"&amp;gt;The node.&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
&amp;lt;param name="value"&amp;gt;The value.&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;static&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; SetValue&amp;lt;T&amp;gt;(XmlNode
node, T value)&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt;(node
== &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;)
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//invalid
node&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt;;&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt;(!IsConvertible(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;typeof&lt;/span&gt;(T)))
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//cast
is not possible&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt;;&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; toSet &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; Convert.ToString(value);&lt;br&gt;
node.InnerText &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; toSet;&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;p&gt;
Die Verwendung könnte dann wie folgt aussehen:
&lt;/p&gt;
&lt;pre style="FONT-SIZE: 11px; FONT-FAMILY: Courier New"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;internal&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; Program&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;private&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;static&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; Main(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt;[]
args)&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; xml &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: rgb(102,102,102); FONT-FAMILY: Courier New; BACKGROUND-COLOR: rgb(228,228,228)"&gt;"&amp;lt;root&amp;gt;&amp;lt;my-bool&amp;gt;true&amp;lt;/my-bool&amp;gt;&amp;lt;/root&amp;gt;"&lt;/span&gt;;&lt;br&gt;
XmlDocument doc &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; XmlDocument();&lt;br&gt;
doc.LoadXml(xml);&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bool&lt;/span&gt; myBool &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; NodeHelper.GetValue&amp;lt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bool&lt;/span&gt;&amp;gt;(doc.DocumentElement[&lt;span style="FONT-SIZE: 11px; COLOR: rgb(102,102,102); FONT-FAMILY: Courier New; BACKGROUND-COLOR: rgb(228,228,228)"&gt;"my-bool"&lt;/span&gt;], &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;false&lt;/span&gt;);&lt;br&gt;
NodeHelper.SetValue&amp;lt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bool&lt;/span&gt;&amp;gt;(doc.DocumentElement[&lt;span style="FONT-SIZE: 11px; COLOR: rgb(102,102,102); FONT-FAMILY: Courier New; BACKGROUND-COLOR: rgb(228,228,228)"&gt;"my-bool"&lt;/span&gt;],
!myBool);&lt;br&gt;
}&lt;br&gt;
}&lt;/span&gt;&lt;/pre&gt;
&lt;img width="0" height="0" src="http://blog.waitz.biz/aggbug.ashx?id=1c1e9be0-9827-4e53-aa7a-a97d917c933e" /&gt;</description>
      <comments>http://blog.waitz.biz/CommentView,guid,1c1e9be0-9827-4e53-aa7a-a97d917c933e.aspx</comments>
      <category>.NET;Snippets</category>
    </item>
    <item>
      <trackback:ping>http://blog.waitz.biz/Trackback.aspx?guid=d0a4b17c-7db4-472c-ab62-7bb818ce2713</trackback:ping>
      <pingback:server>http://blog.waitz.biz/pingback.aspx</pingback:server>
      <pingback:target>http://blog.waitz.biz/PermaLink,guid,d0a4b17c-7db4-472c-ab62-7bb818ce2713.aspx</pingback:target>
      <dc:creator>Wilko Waitz</dc:creator>
      <wfw:comment>http://blog.waitz.biz/CommentView,guid,d0a4b17c-7db4-472c-ab62-7bb818ce2713.aspx</wfw:comment>
      <wfw:commentRss>http://blog.waitz.biz/SyndicationService.asmx/GetEntryCommentsRss?guid=d0a4b17c-7db4-472c-ab62-7bb818ce2713</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">Vor einiger Zeit hatte ich mal ein kleines
Helferlein geschrieben, um Listen zu sortieren. Gut, das Problem lässt sich eleganter
mit delegates lösen aber Spaß hat es trotzdem gemacht. :)<br /><br /><pre style="font-size: 11px; font-family: Courier New;"><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">using</span> System;<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">using</span> System.Collections.Generic;<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">using</span> System.Reflection;<br /><br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">namespace</span> System.Collections.Generic<br />
{<br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;summary&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
Ein generischer Algorithmus zum sortieren von Listen.</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;/summary&gt;</span><br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">class</span> GenericSort&lt;T&gt;
: IComparer&lt;T&gt;<br />
{<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">private</span> MethodInfo
_method;<br /><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;summary&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
Erzeugt eine Instanz des Typs</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
[invariant] Der übergebene Member kann eine Methode oder ein Property sein.</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
Handelt es sich um eine Methode, darf sie keinen Parameter </span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
besitzen. der Rückgabetyp der Eigenschaft/Methode muß vom Typ</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
IComparable sein.</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;/summary&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;param name="member"&gt;&lt;/param&gt;</span><br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> GenericSort(<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">string</span> member)<br />
{<br />
MemberInfo[] infos <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">typeof</span> (T).GetMember(member);<br /><br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">foreach</span> (MemberInfo
info <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">in</span> infos)<br />
{<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (info.MemberType
== MemberTypes.Property)<br />
{<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (Initialize((PropertyInfo)
info))<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">break</span>;<br />
}<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">else</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (info.MemberType
== MemberTypes.Method)<br />
{<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (Initialize((MethodInfo)
info))<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">break</span>;<br />
}<br />
}<br /><br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span>(_method
== <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">null</span>)<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">throw</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> InvalidOperationException(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Member
does not match the class invariant"</span>);<br />
}<br /><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;summary&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
Initializes the specified info.</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;/summary&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;param name="info"&gt;The info.&lt;/param&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;returns&gt;&lt;/returns&gt;</span><br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">private</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">bool</span> Initialize(PropertyInfo
info)<br />
{<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span> Initialize(info.GetGetMethod());<br />
}<br /><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;summary&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
Initializes the specified info.</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;/summary&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;param name="info"&gt;The info.&lt;/param&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;returns&gt;&lt;/returns&gt;</span><br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">private</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">bool</span> Initialize(MethodInfo
info)<br />
{<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span>(info.GetParameters().Length
&gt; 0)<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">false</span>;<br /><br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span>(!<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">typeof</span>(IComparable).IsAssignableFrom(info.ReturnType))<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">false</span>;<br /><br />
_method <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> info;<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">true</span>;<br />
}<br /><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;summary&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
Compares two objects and returns a value indicating whether one is less than, 
<br />
/// equal to, or greater than the other.</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;/summary&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;param name="x"&gt;The first object to compare.&lt;/param&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;param name="y"&gt;The second object to compare.&lt;/param&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;returns&gt;</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
Value Condition Less than zerox is less than y.Zerox equals y.Greater 
<br />
/// than zerox is greater than y.</span><br /><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">///
&lt;/returns&gt;</span><br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span> Compare(T
x, T y)<br />
{<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span> ((IComparable)
_method.Invoke(x, <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">null</span>)).CompareTo(_method.Invoke(y, <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">null</span>));<br />
}<br />
}<br />
}<br /></span></pre>
Die Sortierung Liste mit Elementen des fiktiven Typs "SomeType" erfolgt dann einfach
über nachfolgenden Aufruf:<br /><br /><pre style="font-size: 11px; font-family: Courier New;"><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">class</span> Program<br />
{<br />
    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">static</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> Main(<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">string</span>[]
args)<br />
    {<br />
        List&lt;SomeType&gt; list <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> List&lt;SomeType&gt;();<br /><br />
        <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//Code</span><br /><br />
        list.Sort(<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> GenericSort&lt;SomeType&gt;(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Value"</span>));<br />
    }<br />
}</span></pre><br /><pre style="font-size: 11px; font-family: Courier New;"><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">class</span> SomeType<br />
{<br />
    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">private</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span> _value;<br /><br />
    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span> Value<br />
    {<br />
        get { <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span> _value;
}<br />
        set { _value <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> value;
}<br />
    }<br />
}<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"><br /></span></span></pre><br /><p></p><img width="0" height="0" src="http://blog.waitz.biz/aggbug.ashx?id=d0a4b17c-7db4-472c-ab62-7bb818ce2713" /></body>
      <title>Nützlich oder nicht, es funktioniert</title>
      <guid isPermaLink="false">http://blog.waitz.biz/PermaLink,guid,d0a4b17c-7db4-472c-ab62-7bb818ce2713.aspx</guid>
      <link>http://blog.waitz.biz/2006/12/05/N%c3%bctzlichOderNichtEsFunktioniert.aspx</link>
      <pubDate>Tue, 05 Dec 2006 19:10:02 GMT</pubDate>
      <description>Vor einiger Zeit hatte ich mal ein kleines Helferlein geschrieben, um Listen zu sortieren. Gut, das Problem lässt sich eleganter mit delegates lösen aber Spaß hat es trotzdem gemacht. :)&lt;br&gt;
&lt;br&gt;
&lt;pre style="font-size: 11px; font-family: Courier New;"&gt;&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;using&lt;/span&gt; System;&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;using&lt;/span&gt; System.Reflection;&lt;br&gt;
&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;namespace&lt;/span&gt; System.Collections.Generic&lt;br&gt;
{&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
Ein generischer Algorithmus zum sortieren von Listen.&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;class&lt;/span&gt; GenericSort&amp;lt;T&amp;gt;
: IComparer&amp;lt;T&amp;gt;&lt;br&gt;
{&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; MethodInfo
_method;&lt;br&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
Erzeugt eine Instanz des Typs&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
[invariant] Der übergebene Member kann eine Methode oder ein Property sein.&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
Handelt es sich um eine Methode, darf sie keinen Parameter &lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
besitzen. der Rückgabetyp der Eigenschaft/Methode muß vom Typ&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
IComparable sein.&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;param name="member"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; GenericSort(&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;string&lt;/span&gt; member)&lt;br&gt;
{&lt;br&gt;
MemberInfo[] infos &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;typeof&lt;/span&gt; (T).GetMember(member);&lt;br&gt;
&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;foreach&lt;/span&gt; (MemberInfo
info &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;in&lt;/span&gt; infos)&lt;br&gt;
{&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (info.MemberType
== MemberTypes.Property)&lt;br&gt;
{&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (Initialize((PropertyInfo)
info))&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;break&lt;/span&gt;;&lt;br&gt;
}&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;else&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (info.MemberType
== MemberTypes.Method)&lt;br&gt;
{&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (Initialize((MethodInfo)
info))&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;break&lt;/span&gt;;&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt;(_method
== &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;null&lt;/span&gt;)&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;throw&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; InvalidOperationException(&lt;span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;"&gt;"Member
does not match the class invariant"&lt;/span&gt;);&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
Initializes the specified info.&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;param name="info"&amp;gt;The info.&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;bool&lt;/span&gt; Initialize(PropertyInfo
info)&lt;br&gt;
{&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; Initialize(info.GetGetMethod());&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
Initializes the specified info.&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;param name="info"&amp;gt;The info.&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;bool&lt;/span&gt; Initialize(MethodInfo
info)&lt;br&gt;
{&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt;(info.GetParameters().Length
&amp;gt; 0)&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;false&lt;/span&gt;;&lt;br&gt;
&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt;(!&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;typeof&lt;/span&gt;(IComparable).IsAssignableFrom(info.ReturnType))&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;false&lt;/span&gt;;&lt;br&gt;
&lt;br&gt;
_method &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; info;&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;true&lt;/span&gt;;&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
Compares two objects and returns a value indicating whether one is less than, 
&lt;br&gt;
/// equal to, or greater than the other.&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;param name="x"&amp;gt;The first object to compare.&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;param name="y"&amp;gt;The second object to compare.&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;returns&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
Value Condition Less than zerox is less than y.Zerox equals y.Greater 
&lt;br&gt;
/// than zerox is greater than y.&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;///
&amp;lt;/returns&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; Compare(T
x, T y)&lt;br&gt;
{&lt;br&gt;
&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; ((IComparable)
_method.Invoke(x, &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;null&lt;/span&gt;)).CompareTo(_method.Invoke(y, &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;null&lt;/span&gt;));&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;&lt;/pre&gt;
Die Sortierung Liste mit Elementen des fiktiven Typs "SomeType" erfolgt dann einfach
über nachfolgenden Aufruf:&lt;br&gt;
&lt;br&gt;
&lt;pre style="font-size: 11px; font-family: Courier New;"&gt;&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;class&lt;/span&gt; Program&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;void&lt;/span&gt; Main(&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;string&lt;/span&gt;[]
args)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;SomeType&amp;gt; list &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; List&amp;lt;SomeType&amp;gt;();&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//Code&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;list.Sort(&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; GenericSort&amp;lt;SomeType&amp;gt;(&lt;span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;"&gt;"Value"&lt;/span&gt;));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
}&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;pre style="font-size: 11px; font-family: Courier New;"&gt;&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;class&lt;/span&gt; SomeType&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; _value;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; Value&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; _value;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set { _value &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; value;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
}&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.waitz.biz/aggbug.ashx?id=d0a4b17c-7db4-472c-ab62-7bb818ce2713" /&gt;</description>
      <comments>http://blog.waitz.biz/CommentView,guid,d0a4b17c-7db4-472c-ab62-7bb818ce2713.aspx</comments>
      <category>.NET;Snippets</category>
    </item>
  </channel>
</rss>