<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" 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/"><channel><title>C#</title><link>http://activedeveloper.dk/weblogs/mrjs/category/102.aspx</link><description>Poster om C# relaterede spørgsmål.</description><managingEditor>Jesper Jensen</managingEditor><dc:language>da-DK</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>Jesper Jensen</dc:creator><title>Url replace</title><link>http://activedeveloper.dk/weblogs/mrjs/archive/2006/11/17/6343.aspx</link><pubDate>Fri, 17 Nov 2006 14:01:00 GMT</pubDate><guid>http://activedeveloper.dk/weblogs/mrjs/archive/2006/11/17/6343.aspx</guid><wfw:comment>http://activedeveloper.dk/weblogs/mrjs/comments/6343.aspx</wfw:comment><comments>http://activedeveloper.dk/weblogs/mrjs/archive/2006/11/17/6343.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://activedeveloper.dk/weblogs/mrjs/comments/commentRss/6343.aspx</wfw:commentRss><trackback:ping>http://activedeveloper.dk/weblogs/mrjs/services/trackbacks/6343.aspx</trackback:ping><description>&lt;p&gt;Jeg må indrømme at det er et stykke tid siden jeg har kodet en 'ægte' &lt;em&gt;Custom Control -&lt;/em&gt; faktisk, så tror jeg ikke jeg har rørt ved det siden v 1.0... Anyway, jeg sidder og roder med en lille hjemmeside for en løbeklub, og har bl.a. åbnet for at besøgende kan poste kommentarer til indholdet. I disse kommentarer tillader jeg ikke postning af Html (ValidateRequest = "True"). Nu kunne jeg i mellemtiden godt tænke mig at kommentarer med Url'er blev omdannet til hyperlinks, så brugeren kan klikke på dem... Det ved vi jo godt hvordan man gør: &lt;a href="http://activedeveloper.dk/download/default.asp?mode=showdownload&amp;amp;id=200"&gt;http://activedeveloper.dk/download/default.asp?mode=showdownload&amp;amp;id=200&lt;/a&gt; - ja det virker stadig, men det skriger jo på en C# udgave;-)&lt;/p&gt;
&lt;p&gt;Min første tilgang til opgaven, var at lave en replace på brugerens postede tekst, inden indholdet blev gemt i datafilen, men er det nu helt rigtigt? Så ville jeg jo manipulerer brugerens indtastning med min &lt;em&gt;RegEx&lt;/em&gt; metode, og tabe brugerens originale indput for evigt... Måske ikke det værste for en løbeklub, men princippet er jo forkert, og som den nørd jeg er, må det gøres bedre.&lt;/p&gt;
&lt;p&gt;Jeg løste problemet ved at lave en ny kontrol: &lt;em&gt;SearchReplaceLiteral&lt;/em&gt; som arver fra &lt;em&gt;Literal&lt;/em&gt; kontrollen. Det er den mest simple outputkontrol, som understøtter databinding, og som ikke laver al mulig snavs i Html-output. Så var det bare at lave en override på &lt;em&gt;Render-&lt;/em&gt;metoden, hvori jeg indsatte mit gamle JScript kode (næsten):&lt;/p&gt;
&lt;div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Consolas"&gt;
&lt;div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Consolas"&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;namespace&lt;/span&gt; Onh3&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; &lt;span style="COLOR: teal"&gt;SearchReplaceLiteral&lt;/span&gt; : &lt;span style="COLOR: teal"&gt;Literal&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: teal"&gt;Regex&lt;/span&gt; urlregex = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: teal"&gt;Regex&lt;/span&gt;(&lt;span style="COLOR: maroon"&gt;@"(^|[ \t\r\n])((ftp|http|https|gopher|mailto|news|nntp|telnet|wais|file|prospero|aim|webcal):(([A-Za-z0-9$_.+!*(),;/?:@&amp;amp;~=-])|%[A-Fa-f0-9]{2}){2,}(#([a-zA-Z0-9][a-zA-Z0-9$_.+!*(),;/?:@&amp;amp;~=%-]*))?([A-Za-z0-9$_+!*();/?:~-]))"&lt;/span&gt;, &lt;span style="COLOR: teal"&gt;RegexOptions&lt;/span&gt;.IgnoreCase | &lt;span style="COLOR: teal"&gt;RegexOptions&lt;/span&gt;.Compiled);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; SearchReplaceLiteral()&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;override&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Render(&lt;span style="COLOR: teal"&gt;HtmlTextWriter&lt;/span&gt; writer)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; content = &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.Text;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (!&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;.IsNullOrEmpty(content))&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.Mode == &lt;span style="COLOR: teal"&gt;LiteralMode&lt;/span&gt;.Encode)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    content = urlregex.Replace(content, &lt;span style="COLOR: maroon"&gt;"&amp;lt;a href=\"$2\" target=_blank&amp;gt;$2&amp;lt;/a&amp;gt;"&lt;/span&gt;);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    content = content.Replace(&lt;span style="COLOR: maroon"&gt;"\n"&lt;/span&gt;, &lt;span style="COLOR: maroon"&gt;"&amp;lt;br /&amp;gt;"&lt;/span&gt;);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    &lt;span style="COLOR: green"&gt;// Lineiskift replace - nu hvor jeg er i gang... ;-)&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    writer.Write(content);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                &lt;span style="COLOR: blue"&gt;else&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    &lt;span style="COLOR: teal"&gt;HttpUtility&lt;/span&gt;.HtmlEncode(content, writer);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;!--EndFragment--&gt;&lt;/div&gt;
&lt;p&gt;Dermed har jeg altså en kontrol, som kan 'hyperlinke' alt mit output ved output - ikke noget med at manipulerer og tabe historik.&lt;/p&gt;
&lt;p&gt;Code on...&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p id="zoundry_bw_tags"&gt;&lt;!-- Tag links generated by Zoundry Blog Writer. Do not manually edit. http://www.zoundry.com --&gt;&lt;span class="tags"&gt;&lt;span class="tagspaces"&gt;Technorati&lt;/span&gt; : &lt;a href="http://technorati.com/tag/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;img src ="http://activedeveloper.dk/weblogs/mrjs/aggbug/6343.aspx" width = "1" height = "1" /&gt;</description><body xmlns="http://www.w3.org/1999/xhtml"><p>Jeg må indrømme at det er et stykke tid siden jeg har kodet en 'ægte' <em>Custom Control -</em> faktisk, så tror jeg ikke jeg har rørt ved det siden v 1.0... Anyway, jeg sidder og roder med en lille hjemmeside for en løbeklub, og har bl.a. åbnet for at besøgende kan poste kommentarer til indholdet. I disse kommentarer tillader jeg ikke postning af Html (ValidateRequest = "True"). Nu kunne jeg i mellemtiden godt tænke mig at kommentarer med Url'er blev omdannet til hyperlinks, så brugeren kan klikke på dem... Det ved vi jo godt hvordan man gør: <a href="http://activedeveloper.dk/download/default.asp?mode=showdownload&amp;id=200">http://activedeveloper.dk/download/default.asp?mode=showdownload&amp;id=200</a> - ja det virker stadig, men det skriger jo på en C# udgave;-)</p>
<p>Min første tilgang til opgaven, var at lave en replace på brugerens postede tekst, inden indholdet blev gemt i datafilen, men er det nu helt rigtigt? Så ville jeg jo manipulerer brugerens indtastning med min <em>RegEx</em> metode, og tabe brugerens originale indput for evigt... Måske ikke det værste for en løbeklub, men princippet er jo forkert, og som den nørd jeg er, må det gøres bedre.</p>
<p>Jeg løste problemet ved at lave en ny kontrol: <em>SearchReplaceLiteral</em> som arver fra <em>Literal</em> kontrollen. Det er den mest simple outputkontrol, som understøtter databinding, og som ikke laver al mulig snavs i Html-output. Så var det bare at lave en override på <em>Render-</em>metoden, hvori jeg indsatte mit gamle JScript kode (næsten):</p>
<div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Consolas">
<div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Consolas">
<p style="MARGIN: 0px"><span style="COLOR: blue">namespace</span> Onh3</p>
<p style="MARGIN: 0px">{</p>
<p style="MARGIN: 0px">    <span style="COLOR: blue">public</span> <span style="COLOR: blue">class</span> <span style="COLOR: teal">SearchReplaceLiteral</span> : <span style="COLOR: teal">Literal</span></p>
<p style="MARGIN: 0px">    {</p>
<p style="MARGIN: 0px">        <span style="COLOR: teal">Regex</span> urlregex = <span style="COLOR: blue">new</span> <span style="COLOR: teal">Regex</span>(<span style="COLOR: maroon">@"(^|[ \t\r\n])((ftp|http|https|gopher|mailto|news|nntp|telnet|wais|file|prospero|aim|webcal):(([A-Za-z0-9$_.+!*(),;/?:@&amp;~=-])|%[A-Fa-f0-9]{2}){2,}(#([a-zA-Z0-9][a-zA-Z0-9$_.+!*(),;/?:@&amp;~=%-]*))?([A-Za-z0-9$_+!*();/?:~-]))"</span>, <span style="COLOR: teal">RegexOptions</span>.IgnoreCase | <span style="COLOR: teal">RegexOptions</span>.Compiled);</p>
<p style="MARGIN: 0px"> </p>
<p style="MARGIN: 0px">        <span style="COLOR: blue">public</span> SearchReplaceLiteral()</p>
<p style="MARGIN: 0px">        {</p>
<p style="MARGIN: 0px">        }</p>
<p style="MARGIN: 0px"> </p>
<p style="MARGIN: 0px">        <span style="COLOR: blue">protected</span> <span style="COLOR: blue">override</span> <span style="COLOR: blue">void</span> Render(<span style="COLOR: teal">HtmlTextWriter</span> writer)</p>
<p style="MARGIN: 0px">        {</p>
<p style="MARGIN: 0px">            <span style="COLOR: blue">string</span> content = <span style="COLOR: blue">this</span>.Text;</p>
<p style="MARGIN: 0px"> </p>
<p style="MARGIN: 0px">            <span style="COLOR: blue">if</span> (!<span style="COLOR: blue">string</span>.IsNullOrEmpty(content))</p>
<p style="MARGIN: 0px">            {</p>
<p style="MARGIN: 0px">                <span style="COLOR: blue">if</span> (<span style="COLOR: blue">this</span>.Mode == <span style="COLOR: teal">LiteralMode</span>.Encode)</p>
<p style="MARGIN: 0px">                {</p>
<p style="MARGIN: 0px">                    content = urlregex.Replace(content, <span style="COLOR: maroon">"&lt;a href=\"$2\" target=_blank&gt;$2&lt;/a&gt;"</span>);</p>
<p style="MARGIN: 0px">                    content = content.Replace(<span style="COLOR: maroon">"\n"</span>, <span style="COLOR: maroon">"&lt;br /&gt;"</span>);</p>
<p style="MARGIN: 0px">                    <span style="COLOR: green">// Lineiskift replace - nu hvor jeg er i gang... ;-)</span></p>
<p style="MARGIN: 0px">                    writer.Write(content);</p>
<p style="MARGIN: 0px">                }</p>
<p style="MARGIN: 0px">                <span style="COLOR: blue">else</span></p>
<p style="MARGIN: 0px">                {</p>
<p style="MARGIN: 0px">                    <span style="COLOR: teal">HttpUtility</span>.HtmlEncode(content, writer);</p>
<p style="MARGIN: 0px">                }</p>
<p style="MARGIN: 0px">            }</p>
<p style="MARGIN: 0px">        }</p>
<p style="MARGIN: 0px">    }</p>
<p style="MARGIN: 0px">}</p></div><!--EndFragment--></div>
<p>Dermed har jeg altså en kontrol, som kan 'hyperlinke' alt mit output ved output - ikke noget med at manipulerer og tabe historik.</p>
<p>Code on...</p>
<p><br /></p>
<p id="zoundry_bw_tags"><!-- Tag links generated by Zoundry Blog Writer. Do not manually edit. http://www.zoundry.com --><span class="tags"><span class="tagspaces">Technorati</span> : <a href="http://technorati.com/tag/ASP.NET" rel="tag">ASP.NET</a></span> </p><img src ="http://activedeveloper.dk/weblogs/mrjs/aggbug/6343.aspx" width = "1" height = "1" /></body></item><item><dc:creator>Jesper Jensen</dc:creator><title>Asynchronous Delegate Invocation</title><link>http://activedeveloper.dk/weblogs/mrjs/archive/2006/06/06/3347.aspx</link><pubDate>Tue, 06 Jun 2006 13:36:00 GMT</pubDate><guid>http://activedeveloper.dk/weblogs/mrjs/archive/2006/06/06/3347.aspx</guid><wfw:comment>http://activedeveloper.dk/weblogs/mrjs/comments/3347.aspx</wfw:comment><comments>http://activedeveloper.dk/weblogs/mrjs/archive/2006/06/06/3347.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://activedeveloper.dk/weblogs/mrjs/comments/commentRss/3347.aspx</wfw:commentRss><trackback:ping>http://activedeveloper.dk/weblogs/mrjs/services/trackbacks/3347.aspx</trackback:ping><description>&lt;p&gt;Hvis du har prøvet at arbejde bare lidt med flertrådede applikationer, har du sikkert også stiftet bekendskab med &lt;em&gt;Threading&lt;/em&gt; og &lt;em&gt;ThreadStart.&lt;/em&gt; Jeg synes selv at alle disse begreber der er forbundet med threading kan virke meget forvirrende. Hvis man bare ønsker at kalde en metode på en klasse, og ikke har noget begreb om threadpool, locks og Invocation? Skal man virkelig sætte sig ind i alt det?&lt;/p&gt;
&lt;p&gt;Nej - er svaret!&lt;/p&gt;
&lt;p&gt;I langt de fleste tilfælde, kan man sagtens nøjes med at kalde sin metode via &lt;span class="clsSubhead"&gt;&lt;em&gt;Asynchronous Delegate Invocation&lt;/em&gt;. Det lyder langt mere avanceret end det egentlig er. Begrebet dækker over at enhver &lt;em&gt;delegate&lt;/em&gt; kan referere til en instans metode, og at delegates bliver udstyret med to ekstra metoder (via kompileren): &lt;em&gt;BeginInvoke and EndInvoke.&lt;/em&gt; Disse metoder gør det muligt at kalde synkrone metoder asynkront - altså delegerer udførslen ud på en anden tråd...&lt;/span&gt;&lt;/p&gt;
&lt;div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Consolas"&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span class="clsSubhead"&gt;&lt;span style="COLOR: blue"&gt;class&lt;/span&gt; &lt;span style="COLOR: teal"&gt;Program&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: green"&gt;// Metode signatur der gør det muligt at kalde metoden asynkront&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;  public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;delegate&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; &lt;span style="COLOR: teal"&gt;AdiDelegate&lt;/span&gt;();&lt;/p&gt;&lt;br /&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;  public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Compute()&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;  {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: green"&gt;    // Her simuleres udførsel af en tidskrævende operation&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: teal"&gt;    Thread&lt;/span&gt;.Sleep(10000);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: teal"&gt;    Console&lt;/span&gt;.WriteLine(&lt;span style="COLOR: maroon"&gt;"Compute blev færdig"&lt;/span&gt;);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;  }&lt;/p&gt;&lt;br /&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;  static&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Main(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;[] args)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;  {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: teal"&gt;    Console&lt;/span&gt;.WriteLine(&lt;span style="COLOR: maroon"&gt;"Start"&lt;/span&gt;);&lt;/p&gt;&lt;br /&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: teal"&gt;    AdiDelegate&lt;/span&gt; starter = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: teal"&gt;AdiDelegate&lt;/span&gt;(Compute);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: green"&gt;    // Så eksehverer vi metoden på en anden tråd&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    starter.BeginInvoke(&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;, &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: green"&gt;    // og her forsætter vi med det samme...&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: teal"&gt;    Console&lt;/span&gt;.WriteLine(&lt;span style="COLOR: maroon"&gt;"Hovedtråd forsætter..."&lt;/span&gt;);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: teal"&gt;    Console&lt;/span&gt;.ReadLine();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;  }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;!--EndFragment--&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Ovenstående metode til asynkrone kald, er ikke bare lettere at kode (antal af linier), men den er også effektiv, i det den tager tråde fra threadpool'en, og på den måde gør dit program mere effektivt. Så hvis du ikke lige frem er ude efter en helt specifik håndtering af de individuelle tråde, skulle ovenstående række til 9 ud af 10 situationer.&lt;/p&gt;
&lt;p&gt;Ovenstående kan gøres endnu mere simpelt ved at bruge een af de system-definerede delegate-typer som f.eks.: &lt;em&gt;System.Windows.Forms.MethodInvoker -&lt;/em&gt; så slipper du for den delegate deklarering (medtaget her for overskueligheden).&lt;/p&gt;
&lt;p&gt;Code on...&lt;/p&gt;
&lt;p&gt;Og ja - jeg ved det der er kun 55 dage til deadline, men jeg har desværre ikke haft tid til at bore længere ned i gadgets - dog er der ved at forme sig en ide til vinderprojektet i mit baghoved...&lt;/p&gt;&lt;img src ="http://activedeveloper.dk/weblogs/mrjs/aggbug/3347.aspx" width = "1" height = "1" /&gt;</description><body xmlns="http://www.w3.org/1999/xhtml"><p>Hvis du har prøvet at arbejde bare lidt med flertrådede applikationer, har du sikkert også stiftet bekendskab med <em>Threading</em> og <em>ThreadStart.</em> Jeg synes selv at alle disse begreber der er forbundet med threading kan virke meget forvirrende. Hvis man bare ønsker at kalde en metode på en klasse, og ikke har noget begreb om threadpool, locks og Invocation? Skal man virkelig sætte sig ind i alt det?</p>
<p>Nej - er svaret!</p>
<p>I langt de fleste tilfælde, kan man sagtens nøjes med at kalde sin metode via <span class="clsSubhead"><em>Asynchronous Delegate Invocation</em>. Det lyder langt mere avanceret end det egentlig er. Begrebet dækker over at enhver <em>delegate</em> kan referere til en instans metode, og at delegates bliver udstyret med to ekstra metoder (via kompileren): <em>BeginInvoke and EndInvoke.</em> Disse metoder gør det muligt at kalde synkrone metoder asynkront - altså delegerer udførslen ud på en anden tråd...</span></p>
<div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Consolas">
<p style="MARGIN: 0px"><span class="clsSubhead"><span style="COLOR: blue">class</span> <span style="COLOR: teal">Program</span></span></p>
<p style="MARGIN: 0px">{</p>
<p style="MARGIN: 0px"><span style="COLOR: green">// Metode signatur der gør det muligt at kalde metoden asynkront</span></p>
<p style="MARGIN: 0px"><span style="COLOR: blue">  public</span> <span style="COLOR: blue">delegate</span> <span style="COLOR: blue">void</span> <span style="COLOR: teal">AdiDelegate</span>();</p><br />
<p style="MARGIN: 0px"><span style="COLOR: blue">  public</span> <span style="COLOR: blue">static</span> <span style="COLOR: blue">void</span> Compute()</p>
<p style="MARGIN: 0px">  {</p>
<p style="MARGIN: 0px"><span style="COLOR: green">    // Her simuleres udførsel af en tidskrævende operation</span></p>
<p style="MARGIN: 0px"><span style="COLOR: teal">    Thread</span>.Sleep(10000);</p>
<p style="MARGIN: 0px"><span style="COLOR: teal">    Console</span>.WriteLine(<span style="COLOR: maroon">"Compute blev færdig"</span>);</p>
<p style="MARGIN: 0px">  }</p><br />
<p style="MARGIN: 0px"><span style="COLOR: blue">  static</span> <span style="COLOR: blue">void</span> Main(<span style="COLOR: blue">string</span>[] args)</p>
<p style="MARGIN: 0px">  {</p>
<p style="MARGIN: 0px"><span style="COLOR: teal">    Console</span>.WriteLine(<span style="COLOR: maroon">"Start"</span>);</p><br />
<p style="MARGIN: 0px"><span style="COLOR: teal">    AdiDelegate</span> starter = <span style="COLOR: blue">new</span> <span style="COLOR: teal">AdiDelegate</span>(Compute);</p>
<p style="MARGIN: 0px"><span style="COLOR: green">    // Så eksehverer vi metoden på en anden tråd</span></p>
<p style="MARGIN: 0px">    starter.BeginInvoke(<span style="COLOR: blue">null</span>, <span style="COLOR: blue">null</span>);</p>
<p style="MARGIN: 0px"><span style="COLOR: green">    // og her forsætter vi med det samme...</span></p>
<p style="MARGIN: 0px"><span style="COLOR: teal">    Console</span>.WriteLine(<span style="COLOR: maroon">"Hovedtråd forsætter..."</span>);</p>
<p style="MARGIN: 0px"><span style="COLOR: teal">    Console</span>.ReadLine();</p>
<p style="MARGIN: 0px">  }</p>
<p style="MARGIN: 0px">}</p></div><!--EndFragment-->
<p><br /></p>
<p>Ovenstående metode til asynkrone kald, er ikke bare lettere at kode (antal af linier), men den er også effektiv, i det den tager tråde fra threadpool'en, og på den måde gør dit program mere effektivt. Så hvis du ikke lige frem er ude efter en helt specifik håndtering af de individuelle tråde, skulle ovenstående række til 9 ud af 10 situationer.</p>
<p>Ovenstående kan gøres endnu mere simpelt ved at bruge een af de system-definerede delegate-typer som f.eks.: <em>System.Windows.Forms.MethodInvoker -</em> så slipper du for den delegate deklarering (medtaget her for overskueligheden).</p>
<p>Code on...</p>
<p>Og ja - jeg ved det der er kun 55 dage til deadline, men jeg har desværre ikke haft tid til at bore længere ned i gadgets - dog er der ved at forme sig en ide til vinderprojektet i mit baghoved...</p><img src ="http://activedeveloper.dk/weblogs/mrjs/aggbug/3347.aspx" width = "1" height = "1" /></body></item><item><dc:creator>Jesper Jensen</dc:creator><title>Flere forsøg med Enum</title><link>http://activedeveloper.dk/weblogs/mrjs/archive/2006/05/18/2979.aspx</link><pubDate>Thu, 18 May 2006 07:09:00 GMT</pubDate><guid>http://activedeveloper.dk/weblogs/mrjs/archive/2006/05/18/2979.aspx</guid><wfw:comment>http://activedeveloper.dk/weblogs/mrjs/comments/2979.aspx</wfw:comment><comments>http://activedeveloper.dk/weblogs/mrjs/archive/2006/05/18/2979.aspx#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://activedeveloper.dk/weblogs/mrjs/comments/commentRss/2979.aspx</wfw:commentRss><trackback:ping>http://activedeveloper.dk/weblogs/mrjs/services/trackbacks/2979.aspx</trackback:ping><description>&lt;p&gt;Jeg har en løbende udfordring til mig selv: Find en optimal måde at bruge &lt;em&gt;Enum&lt;/em&gt; som datakile. Som jeg tidligere har &lt;a title="Enum datakilde til ComboBox" href="/weblogs/mrjs/archive/2006/03/03/2350.aspx"&gt;skrevet&lt;/a&gt;, så synes jeg ikke rigtigt at frameworket har den helt rigtige løsning på problemet/udfordringen. Løsningen som jeg tidligere har beskrevet, fungerer perfekt, men er ærligt talt lidt tung.&lt;/p&gt;
&lt;p&gt;Et af mine ynglings citater er: &lt;a href="http://www.worldofquotes.com/author/Antoine-De-Saint~exupery/1/index.html"&gt;You know you've achieved perfection in design, Not when you have nothing more to add, But when you have nothing more to take away.&lt;/a&gt; af &lt;a href="http://www.google.dk/search?hl=da&amp;amp;q=Antoine+De+Saint-exupery+&amp;amp;meta="&gt;&lt;em&gt;Antoine De Saint-exupery&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt; Så min &lt;em&gt;Quest for Perfection&lt;/em&gt; er ikke færdig ;-)&lt;/p&gt;
&lt;p&gt;Jeg bruger &lt;em&gt;Enum&lt;/em&gt; i vid udstrækning, og vil gerne havde en nem måde at sorterer i værdierne, så det for det første; ikke bare er alle værdier der bliver brugt, men kun dem der er interessante i den konkrete sammenhæng, og for det andet, så skal jeg kunne bestemme ordlyden af de enkelte værdier. Så var det jeg tænkte: &lt;em&gt;Attributter.&lt;/em&gt; Hvis man nu markerer de værdier man ønsker at bruge med en attribut:&lt;/p&gt;
&lt;div style="FONT-SIZE: 10pt; BACKGROUND: #ffffff; COLOR: black; FONT-FAMILY: Consolas"&gt;&lt;span style="BACKGROUND: white"&gt;
&lt;div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Consolas"&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;    6&lt;/span&gt;     &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;enum&lt;/span&gt; &lt;span style="COLOR: teal"&gt;ProductType&lt;/span&gt; : &lt;span style="COLOR: blue"&gt;int&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;    7&lt;/span&gt;     {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;    8&lt;/span&gt;         [&lt;span style="COLOR: teal"&gt;Description&lt;/span&gt;(&lt;span style="COLOR: maroon"&gt;"Ubestemt"&lt;/span&gt;)] Undefined = 0,&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;    9&lt;/span&gt;         [&lt;span style="COLOR: teal"&gt;Description&lt;/span&gt;(&lt;span style="COLOR: maroon"&gt;"25 kg sæk"&lt;/span&gt;)] Sack25Kg = 1,&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   10&lt;/span&gt;         [&lt;span style="COLOR: teal"&gt;Description&lt;/span&gt;(&lt;span style="COLOR: maroon"&gt;"5 kg pose"&lt;/span&gt;)] Bag5Kg = 2,&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   11&lt;/span&gt;         [&lt;span style="COLOR: teal"&gt;Description&lt;/span&gt;(&lt;span style="COLOR: maroon"&gt;"4 x 5 kg pakning"&lt;/span&gt;)] Pack4x5Kg = 3,&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   12&lt;/span&gt;         [&lt;span style="COLOR: teal"&gt;Description&lt;/span&gt;(&lt;span style="COLOR: maroon"&gt;"Spand 1 l"&lt;/span&gt;)] Bucket1L = 4,&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   13&lt;/span&gt;         Bucket2_5L = 5,&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   14&lt;/span&gt;         Bucket5L = 6,&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   15&lt;/span&gt;         Bucket10L = 7,&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   16&lt;/span&gt;         Dunk1L = 8,&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   17&lt;/span&gt;         Dunk2L = 9,&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   18&lt;/span&gt;         Dunk10L = 10,&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   19&lt;/span&gt;         Box = 11&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   20&lt;/span&gt;     }&lt;/p&gt;&lt;/div&gt;&lt;!--EndFragment--&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;!--EndFragment--&gt;Her er det altså kun værdierne: 0, 1, 2, 3 og 4 jeg ønsker at binde til f.eks. en combobox. (&lt;em&gt;DescriptionAttributten&lt;/em&gt; findes i forvejen i: &lt;span style="FONT-SIZE: 0.75em"&gt;System.ComponentModel).&lt;/span&gt; &lt;span style="FONT-SIZE: 0.9em"&gt;Jeg skal så bare bruge en &lt;em&gt;Factory&lt;/em&gt; metode der kan tage en sådan markeret enum som parameter, og returnerer en eller anden list jeg kan bruge som datasource:&lt;/span&gt;&lt;/p&gt;
&lt;div style="FONT-SIZE: 10pt; BACKGROUND: #ffffff; COLOR: black; FONT-FAMILY: Consolas"&gt;&lt;span style="BACKGROUND: white"&gt;
&lt;div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Consolas"&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;    9&lt;/span&gt;     &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; &lt;span style="COLOR: teal"&gt;EnumSource&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   10&lt;/span&gt;     {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   11&lt;/span&gt;         &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; &lt;span style="COLOR: teal"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="COLOR: teal"&gt;NameValue&lt;/span&gt;&amp;gt; Convert(&lt;span style="COLOR: teal"&gt;Type&lt;/span&gt; enumType)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   12&lt;/span&gt;         {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   13&lt;/span&gt;             &lt;span style="COLOR: teal"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="COLOR: teal"&gt;NameValue&lt;/span&gt;&amp;gt; result = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: teal"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="COLOR: teal"&gt;NameValue&lt;/span&gt;&amp;gt;();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   14&lt;/span&gt;             &lt;span style="COLOR: blue"&gt;object&lt;/span&gt; enumInstance = &lt;span style="COLOR: teal"&gt;Activator&lt;/span&gt;.CreateInstance(enumType);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   15&lt;/span&gt;             &lt;span style="COLOR: blue"&gt;foreach&lt;/span&gt; (&lt;span style="COLOR: teal"&gt;FieldInfo&lt;/span&gt; field &lt;span style="COLOR: blue"&gt;in&lt;/span&gt; enumType.GetFields())&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   16&lt;/span&gt;             {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   17&lt;/span&gt;                 &lt;span style="COLOR: teal"&gt;DescriptionAttribute&lt;/span&gt; da =&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   18&lt;/span&gt;                     &lt;span style="COLOR: teal"&gt;Attribute&lt;/span&gt;.GetCustomAttribute(field, &lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;(&lt;span style="COLOR: teal"&gt;DescriptionAttribute&lt;/span&gt;)) &lt;span style="COLOR: blue"&gt;as&lt;/span&gt; &lt;span style="COLOR: teal"&gt;DescriptionAttribute&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   19&lt;/span&gt;                 &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (da == &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   20&lt;/span&gt;                     &lt;span style="COLOR: blue"&gt;continue&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   21&lt;/span&gt;                 result.Add(&lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: teal"&gt;NameValue&lt;/span&gt;(da.Description, field.GetValue(enumInstance)));&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   22&lt;/span&gt;             }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   23&lt;/span&gt;             &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; result;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   24&lt;/span&gt;         }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   25&lt;/span&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   26&lt;/span&gt;         &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; &lt;span style="COLOR: teal"&gt;NameValue&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   27&lt;/span&gt;         {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   28&lt;/span&gt;             &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; NameValue(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; name, &lt;span style="COLOR: blue"&gt;object&lt;/span&gt; value)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   29&lt;/span&gt;             {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   30&lt;/span&gt;                 &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.name = name;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   31&lt;/span&gt;                 &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.value = value;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   32&lt;/span&gt;             }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   33&lt;/span&gt;             &lt;span style="COLOR: blue"&gt;private&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; name;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   34&lt;/span&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   35&lt;/span&gt;             &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; Name&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   36&lt;/span&gt;             {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   37&lt;/span&gt;                 &lt;span style="COLOR: blue"&gt;get&lt;/span&gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; name; }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   38&lt;/span&gt;                 &lt;span style="COLOR: blue"&gt;set&lt;/span&gt; { name = &lt;span style="COLOR: blue"&gt;value&lt;/span&gt;; }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   39&lt;/span&gt;             }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   40&lt;/span&gt;             &lt;span style="COLOR: blue"&gt;private&lt;/span&gt; &lt;span style="COLOR: blue"&gt;object&lt;/span&gt; value;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   41&lt;/span&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   42&lt;/span&gt;             &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;object&lt;/span&gt; Value&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   43&lt;/span&gt;             {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   44&lt;/span&gt;                 &lt;span style="COLOR: blue"&gt;get&lt;/span&gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.value; }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   45&lt;/span&gt;                 &lt;span style="COLOR: blue"&gt;set&lt;/span&gt; { &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.value = &lt;span style="COLOR: blue"&gt;value&lt;/span&gt;; }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   46&lt;/span&gt;             }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   47&lt;/span&gt;         }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   48&lt;/span&gt;     }&lt;/p&gt;&lt;/div&gt;&lt;!--EndFragment--&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Den statiske metode er ret simpel, i det den blot itererer over felterne i typen, og undersøger om de enkelte felter er markeret med Description attributten - hvis ja; tilføjes indholdet af attributten til resultatlisten, hvis nej; forsættes til næste felt. Læg mærke til at det der fylder mest her er implementeringen af &lt;em&gt;NameValue&lt;/em&gt; klassen, der skal være med fuld implementering af get/set, for at man an opnå databinding.:&lt;/p&gt;
&lt;div style="FONT-SIZE: 10pt; BACKGROUND: #ffffff; COLOR: black; FONT-FAMILY: Consolas"&gt;&lt;span style="BACKGROUND: white"&gt;
&lt;div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Consolas"&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   20&lt;/span&gt;             ColumnProductType.DataSource = &lt;span style="COLOR: teal"&gt;EnumSource&lt;/span&gt;.Convert(&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;(&lt;span style="COLOR: teal"&gt;ProductType&lt;/span&gt;));&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   21&lt;/span&gt;             ColumnProductType.DisplayMember = &lt;span style="COLOR: maroon"&gt;"Name"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #2b91af"&gt;   22&lt;/span&gt;             ColumnProductType.ValueMember = &lt;span style="COLOR: maroon"&gt;"Value"&lt;/span&gt;;&lt;/p&gt;&lt;/div&gt;&lt;!--EndFragment--&gt;&lt;/span&gt;&lt;/div&gt;&lt;!--EndFragment--&gt;
&lt;p&gt;Vupti - jeg har min liste bundet til min enum:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.3wp.dk/114793343379.JPG"&gt;&lt;br /&gt;&lt;img id="ViewPicture.ascx_GalleryImage" style="BORDER-RIGHT: black 2px solid; BORDER-TOP: black 2px solid; BORDER-LEFT: black 2px solid; WIDTH: 394px; BORDER-BOTTOM: black 2px solid; HEIGHT: 237px" alt="Enum Box" src="/weblogs//images/activedeveloper_dk/mrjs/41/r_EnumBox.JPG" /&gt; &lt;br /&gt;&lt;br /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Næste skridt: Implementering af lokalicering af beskrivelsen. Det må være muligt at instantierer en RessourceManager der tager strenge fra en resx fil. Min nuværende kunde efterspørger ikke den feature, så den gider jeg ikke at lave lige nu (laver du den, så post endelig løsningen her) - man er vel pragmatisk!&lt;/p&gt;
&lt;p&gt;Code on...&lt;/p&gt;&lt;img src ="http://activedeveloper.dk/weblogs/mrjs/aggbug/2979.aspx" width = "1" height = "1" /&gt;</description><body xmlns="http://www.w3.org/1999/xhtml"><p>Jeg har en løbende udfordring til mig selv: Find en optimal måde at bruge <em>Enum</em> som datakile. Som jeg tidligere har <a title="Enum datakilde til ComboBox" href="/weblogs/mrjs/archive/2006/03/03/2350.aspx">skrevet</a>, så synes jeg ikke rigtigt at frameworket har den helt rigtige løsning på problemet/udfordringen. Løsningen som jeg tidligere har beskrevet, fungerer perfekt, men er ærligt talt lidt tung.</p>
<p>Et af mine ynglings citater er: <a href="http://www.worldofquotes.com/author/Antoine-De-Saint~exupery/1/index.html">You know you've achieved perfection in design, Not when you have nothing more to add, But when you have nothing more to take away.</a> af <a href="http://www.google.dk/search?hl=da&amp;q=Antoine+De+Saint-exupery+&amp;meta="><em>Antoine De Saint-exupery</em></a><em>.</em> Så min <em>Quest for Perfection</em> er ikke færdig ;-)</p>
<p>Jeg bruger <em>Enum</em> i vid udstrækning, og vil gerne havde en nem måde at sorterer i værdierne, så det for det første; ikke bare er alle værdier der bliver brugt, men kun dem der er interessante i den konkrete sammenhæng, og for det andet, så skal jeg kunne bestemme ordlyden af de enkelte værdier. Så var det jeg tænkte: <em>Attributter.</em> Hvis man nu markerer de værdier man ønsker at bruge med en attribut:</p>
<div style="FONT-SIZE: 10pt; BACKGROUND: #ffffff; COLOR: black; FONT-FAMILY: Consolas"><span style="BACKGROUND: white">
<div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Consolas">
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">    6</span>     <span style="COLOR: blue">public</span> <span style="COLOR: blue">enum</span> <span style="COLOR: teal">ProductType</span> : <span style="COLOR: blue">int</span></p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">    7</span>     {</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">    8</span>         [<span style="COLOR: teal">Description</span>(<span style="COLOR: maroon">"Ubestemt"</span>)] Undefined = 0,</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">    9</span>         [<span style="COLOR: teal">Description</span>(<span style="COLOR: maroon">"25 kg sæk"</span>)] Sack25Kg = 1,</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   10</span>         [<span style="COLOR: teal">Description</span>(<span style="COLOR: maroon">"5 kg pose"</span>)] Bag5Kg = 2,</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   11</span>         [<span style="COLOR: teal">Description</span>(<span style="COLOR: maroon">"4 x 5 kg pakning"</span>)] Pack4x5Kg = 3,</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   12</span>         [<span style="COLOR: teal">Description</span>(<span style="COLOR: maroon">"Spand 1 l"</span>)] Bucket1L = 4,</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   13</span>         Bucket2_5L = 5,</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   14</span>         Bucket5L = 6,</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   15</span>         Bucket10L = 7,</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   16</span>         Dunk1L = 8,</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   17</span>         Dunk2L = 9,</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   18</span>         Dunk10L = 10,</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   19</span>         Box = 11</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   20</span>     }</p></div><!--EndFragment--></span></div>
<p><!--EndFragment-->Her er det altså kun værdierne: 0, 1, 2, 3 og 4 jeg ønsker at binde til f.eks. en combobox. (<em>DescriptionAttributten</em> findes i forvejen i: <span style="FONT-SIZE: 0.75em">System.ComponentModel).</span> <span style="FONT-SIZE: 0.9em">Jeg skal så bare bruge en <em>Factory</em> metode der kan tage en sådan markeret enum som parameter, og returnerer en eller anden list jeg kan bruge som datasource:</span></p>
<div style="FONT-SIZE: 10pt; BACKGROUND: #ffffff; COLOR: black; FONT-FAMILY: Consolas"><span style="BACKGROUND: white">
<div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Consolas">
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">    9</span>     <span style="COLOR: blue">public</span> <span style="COLOR: blue">class</span> <span style="COLOR: teal">EnumSource</span></p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   10</span>     {</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   11</span>         <span style="COLOR: blue">public</span> <span style="COLOR: blue">static</span> <span style="COLOR: teal">List</span>&lt;<span style="COLOR: teal">NameValue</span>&gt; Convert(<span style="COLOR: teal">Type</span> enumType)</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   12</span>         {</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   13</span>             <span style="COLOR: teal">List</span>&lt;<span style="COLOR: teal">NameValue</span>&gt; result = <span style="COLOR: blue">new</span> <span style="COLOR: teal">List</span>&lt;<span style="COLOR: teal">NameValue</span>&gt;();</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   14</span>             <span style="COLOR: blue">object</span> enumInstance = <span style="COLOR: teal">Activator</span>.CreateInstance(enumType);</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   15</span>             <span style="COLOR: blue">foreach</span> (<span style="COLOR: teal">FieldInfo</span> field <span style="COLOR: blue">in</span> enumType.GetFields())</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   16</span>             {</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   17</span>                 <span style="COLOR: teal">DescriptionAttribute</span> da =</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   18</span>                     <span style="COLOR: teal">Attribute</span>.GetCustomAttribute(field, <span style="COLOR: blue">typeof</span>(<span style="COLOR: teal">DescriptionAttribute</span>)) <span style="COLOR: blue">as</span> <span style="COLOR: teal">DescriptionAttribute</span>;</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   19</span>                 <span style="COLOR: blue">if</span> (da == <span style="COLOR: blue">null</span>)</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   20</span>                     <span style="COLOR: blue">continue</span>;</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   21</span>                 result.Add(<span style="COLOR: blue">new</span> <span style="COLOR: teal">NameValue</span>(da.Description, field.GetValue(enumInstance)));</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   22</span>             }</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   23</span>             <span style="COLOR: blue">return</span> result;</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   24</span>         }</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   25</span> </p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   26</span>         <span style="COLOR: blue">public</span> <span style="COLOR: blue">class</span> <span style="COLOR: teal">NameValue</span></p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   27</span>         {</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   28</span>             <span style="COLOR: blue">public</span> NameValue(<span style="COLOR: blue">string</span> name, <span style="COLOR: blue">object</span> value)</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   29</span>             {</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   30</span>                 <span style="COLOR: blue">this</span>.name = name;</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   31</span>                 <span style="COLOR: blue">this</span>.value = value;</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   32</span>             }</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   33</span>             <span style="COLOR: blue">private</span> <span style="COLOR: blue">string</span> name;</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   34</span> </p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   35</span>             <span style="COLOR: blue">public</span> <span style="COLOR: blue">string</span> Name</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   36</span>             {</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   37</span>                 <span style="COLOR: blue">get</span> { <span style="COLOR: blue">return</span> name; }</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   38</span>                 <span style="COLOR: blue">set</span> { name = <span style="COLOR: blue">value</span>; }</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   39</span>             }</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   40</span>             <span style="COLOR: blue">private</span> <span style="COLOR: blue">object</span> value;</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   41</span> </p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   42</span>             <span style="COLOR: blue">public</span> <span style="COLOR: blue">object</span> Value</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   43</span>             {</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   44</span>                 <span style="COLOR: blue">get</span> { <span style="COLOR: blue">return</span> <span style="COLOR: blue">this</span>.value; }</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   45</span>                 <span style="COLOR: blue">set</span> { <span style="COLOR: blue">this</span>.value = <span style="COLOR: blue">value</span>; }</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   46</span>             }</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   47</span>         }</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   48</span>     }</p></div><!--EndFragment--></span></div>
<p>Den statiske metode er ret simpel, i det den blot itererer over felterne i typen, og undersøger om de enkelte felter er markeret med Description attributten - hvis ja; tilføjes indholdet af attributten til resultatlisten, hvis nej; forsættes til næste felt. Læg mærke til at det der fylder mest her er implementeringen af <em>NameValue</em> klassen, der skal være med fuld implementering af get/set, for at man an opnå databinding.:</p>
<div style="FONT-SIZE: 10pt; BACKGROUND: #ffffff; COLOR: black; FONT-FAMILY: Consolas"><span style="BACKGROUND: white">
<div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Consolas">
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   20</span>             ColumnProductType.DataSource = <span style="COLOR: teal">EnumSource</span>.Convert(<span style="COLOR: blue">typeof</span>(<span style="COLOR: teal">ProductType</span>));</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   21</span>             ColumnProductType.DisplayMember = <span style="COLOR: maroon">"Name"</span>;</p>
<p style="MARGIN: 0px"><span style="COLOR: #2b91af">   22</span>             ColumnProductType.ValueMember = <span style="COLOR: maroon">"Value"</span>;</p></div><!--EndFragment--></span></div><!--EndFragment-->
<p>Vupti - jeg har min liste bundet til min enum:</p>
<p><a href="http://www.3wp.dk/114793343379.JPG"><br /><img id="ViewPicture.ascx_GalleryImage" style="BORDER-RIGHT: black 2px solid; BORDER-TOP: black 2px solid; BORDER-LEFT: black 2px solid; WIDTH: 394px; BORDER-BOTTOM: black 2px solid; HEIGHT: 237px" alt="Enum Box" src="/weblogs//images/activedeveloper_dk/mrjs/41/r_EnumBox.JPG" /> <br /><br /></a></p>
<p>Næste skridt: Implementering af lokalicering af beskrivelsen. Det må være muligt at instantierer en RessourceManager der tager strenge fra en resx fil. Min nuværende kunde efterspørger ikke den feature, så den gider jeg ikke at lave lige nu (laver du den, så post endelig løsningen her) - man er vel pragmatisk!</p>
<p>Code on...</p><img src ="http://activedeveloper.dk/weblogs/mrjs/aggbug/2979.aspx" width = "1" height = "1" /></body></item></channel></rss>