<?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 - Snippets</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>Tue, 12 Dec 2006 18:25:27 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=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=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>