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

<channel>
	<title>Sanity Free Coding</title>
	<atom:link href="http://www.sanity-free.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.sanity-free.com</link>
	<description>Methods to the Madness</description>
	<lastBuildDate>Wed, 10 Dec 2025 07:33:46 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>http://sanity-free.org/wp-content/uploads/2025/10/sanity-free-512-150x150.jpg</url>
	<title>Sanity Free Coding</title>
	<link>http://www.sanity-free.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>A Standard CRC-16 and CRC-16 Kermit implementation in C#</title>
		<link>http://www.sanity-free.com/standard_crc16_and_crc16_kermit_implementation_in_csharp.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Fri, 27 Jul 2012 18:00:00 +0000</pubDate>
				<category><![CDATA[C# Articles]]></category>
		<category><![CDATA[CRC]]></category>
		<category><![CDATA[CRC16]]></category>
		<category><![CDATA[CRC16-CCITT]]></category>
		<category><![CDATA[CRC16-CCITT Kermit]]></category>
		<category><![CDATA[CRC32]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=243</guid>

					<description><![CDATA[Been a while since I posted anything, but here&#8217;s an update to my original CRC-16 class that does CRC-16 with CRC-CCITT Kermit code that I posted over on Stack Overflow a while ago. Unlike the code over there this doesn&#8217;t have a static look-up table (feel free to get the code from over there if [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Been a while since I posted anything, but here&#8217;s an update to my <a href="/standard_crc_16_in_csharp.html">original CRC-16</a> class that does CRC-16 with CRC-CCITT Kermit code that I posted over on <a href="http://stackoverflow.com/questions/5059268/c-sharp-crc-implementation" target="_blank" rel="noreferrer noopener">Stack Overflow</a> a while ago. Unlike the code over there this doesn&#8217;t have a static look-up table (feel free to get the code from over there if you wanted the static table, but I&#8217;m actually not too fond of static look-up tables on example source code though they are more efficient).<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>using System;

public enum Crc16Mode : ushort { Standard = 0xA001, CcittKermit = 0x8408 }

public class Crc16 {
    readonly ushort[] table = new ushort&#91;256&#93;;

    public ushort ComputeChecksum( params byte[] bytes ) {
        ushort crc = 0;
        for(int i = 0; i &lt; bytes.Length; ++i) {
            byte index = (byte)(crc ^ bytes&#91;i&#93;);
            crc = (ushort)((crc >> 8) ^ table&#91;index&#93;);
        }
        return crc;
    }

    public byte[] ComputeChecksumBytes( params byte[] bytes ) {
        ushort crc = ComputeChecksum( bytes );
        return BitConverter.GetBytes( crc );
    }

    public Crc16( Crc16Mode mode ) {
        ushort polynomial = (ushort)mode;
        ushort value;
        ushort temp;
        for(ushort i = 0; i &lt; table.Length; ++i) {
            value = 0;
            temp = i;
            for(byte j = 0; j &lt; 8; ++j) {
                if(((value ^ temp) &amp; 0x0001) != 0) {
                    value = (ushort)((value >> 1) ^ polynomial);
                }else {
                    value >>= 1;
                }
                temp >>= 1;
            }
            table&#91;i&#93; = value;
        }
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">enum</span><span style="color: #000000"> </span><span style="color: #267F99">Crc16Mode</span><span style="color: #000000"> : </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> { </span><span style="color: #001080">Standard</span><span style="color: #000000"> = </span><span style="color: #098658">0xA001</span><span style="color: #000000">, </span><span style="color: #001080">CcittKermit</span><span style="color: #000000"> = </span><span style="color: #098658">0x8408</span><span style="color: #000000"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Crc16</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">readonly</span><span style="color: #000000"> </span><span style="color: #0000FF">ushort</span><span style="color: #000000">[] </span><span style="color: #001080">table</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #0000FF">ushort</span><span style="color: #000000">&#91;</span><span style="color: #098658">256</span><span style="color: #000000">&#93;;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #795E26">ComputeChecksum</span><span style="color: #000000">( </span><span style="color: #0000FF">params</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">bytes</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">i</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">i</span><span style="color: #000000"> &lt; </span><span style="color: #001080">bytes</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000">; ++</span><span style="color: #001080">i</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">index</span><span style="color: #000000"> = (</span><span style="color: #0000FF">byte</span><span style="color: #000000">)(</span><span style="color: #001080">crc</span><span style="color: #000000"> ^ </span><span style="color: #001080">bytes</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">&#93;);</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">crc</span><span style="color: #000000"> = (</span><span style="color: #0000FF">ushort</span><span style="color: #000000">)((</span><span style="color: #001080">crc</span><span style="color: #000000"> &gt;&gt; </span><span style="color: #098658">8</span><span style="color: #000000">) ^ </span><span style="color: #001080">table</span><span style="color: #000000">&#91;</span><span style="color: #001080">index</span><span style="color: #000000">&#93;);</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #795E26">ComputeChecksumBytes</span><span style="color: #000000">( </span><span style="color: #0000FF">params</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">bytes</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000"> = </span><span style="color: #795E26">ComputeChecksum</span><span style="color: #000000">( </span><span style="color: #001080">bytes</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">BitConverter</span><span style="color: #000000">.</span><span style="color: #795E26">GetBytes</span><span style="color: #000000">( </span><span style="color: #001080">crc</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #795E26">Crc16</span><span style="color: #000000">( </span><span style="color: #267F99">Crc16Mode</span><span style="color: #000000"> </span><span style="color: #001080">mode</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">polynomial</span><span style="color: #000000"> = (</span><span style="color: #0000FF">ushort</span><span style="color: #000000">)</span><span style="color: #001080">mode</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">temp</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">i</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">i</span><span style="color: #000000"> &lt; </span><span style="color: #001080">table</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000">; ++</span><span style="color: #001080">i</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">value</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">temp</span><span style="color: #000000"> = </span><span style="color: #001080">i</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">j</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">j</span><span style="color: #000000"> &lt; </span><span style="color: #098658">8</span><span style="color: #000000">; ++</span><span style="color: #001080">j</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000">(((</span><span style="color: #001080">value</span><span style="color: #000000"> ^ </span><span style="color: #001080">temp</span><span style="color: #000000">) &amp; </span><span style="color: #098658">0x0001</span><span style="color: #000000">) != </span><span style="color: #098658">0</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">value</span><span style="color: #000000"> = (</span><span style="color: #0000FF">ushort</span><span style="color: #000000">)((</span><span style="color: #001080">value</span><span style="color: #000000"> &gt;&gt; </span><span style="color: #098658">1</span><span style="color: #000000">) ^ </span><span style="color: #001080">polynomial</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                }</span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">value</span><span style="color: #000000"> &gt;&gt;= </span><span style="color: #098658">1</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">temp</span><span style="color: #000000"> &gt;&gt;= </span><span style="color: #098658">1</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">table</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">&#93; = </span><span style="color: #001080">value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>If you need for this code to be CLS compliant, you can change the method signature&#8217;s return type from ushort to int and it will operate the same (the <code>ushort</code> crc value will be implicitly converted from <code>ushort</code> to <code>int</code>)<br><br><strong>Links to the other C# CRC implementations</strong> <a href="/standard_crc_16_in_csharp.html">the original CRC-16 implementation</a>, <a href="/crc_16_ccitt_in_csharp.html">CRC16-CCITT</a>, <a href="/crc32_implementation_in_csharp.html">CRC-32</a>, and <a href="/crc8_implementation_in_csharp.html">CRC-8</a><br><br>I&#8217;ve consolidated all of these into a single library on <a href="https://github.com/nullfx/NullFX.CRC" target="_blank" rel="noreferrer noopener">GitHub here: NullFX.CRC</a>.<br><br>I&#8217;m also very into Swift at the moment and have created Swift versions of these same classes and released a Swift PM version of this library here as well <a href="https://github.com/nullfx/NullfxCrc" target="_blank" rel="noreferrer noopener">Swift NullfxCrc Package</a></p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>A CRC8 implementation in C#</title>
		<link>http://www.sanity-free.com/crc8_implementation_in_csharp.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Wed, 03 Feb 2010 18:00:00 +0000</pubDate>
				<category><![CDATA[C# Articles]]></category>
		<category><![CDATA[CRC]]></category>
		<category><![CDATA[CRC16]]></category>
		<category><![CDATA[CRC16-CCITT]]></category>
		<category><![CDATA[CRC16-CCITT Kermit]]></category>
		<category><![CDATA[CRC32]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=238</guid>

					<description><![CDATA[So I&#8217;ve tackled CRC32, CRC16, CRC16-CCITT (and now CRC16-CCITT Kermit) implementations, and found myself wanting a CRC8 class to create checksums for small data (1-2 bytes) sets. Not having ever used or seen CRC8 in use before, I did some reading, and as far as I can tell, I&#8217;ve implemented it correctly&#8230; It works anyway, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>So I&#8217;ve tackled <a href="/crc32_implementation_in_csharp.html">CRC32</a>, <a href="/standard_crc_16_in_csharp.html">CRC16</a>, <a href="/crc_16_ccitt_in_csharp.html">CRC16-CCITT</a> (and now <a href="/standard_crc16_and_crc16_kermit_implementation_in_csharp.html">CRC16-CCITT Kermit</a>) implementations, and found myself wanting a CRC8 class to create checksums for small data (1-2 bytes) sets. Not having ever used or seen CRC8 in use before, I did some reading, and as far as I can tell, I&#8217;ve implemented it correctly&#8230; It works anyway, so without further ado, here&#8217;s my implementation:<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public static class Crc8 {
    static byte[] table = new byte&#91;256&#93;;
    // x8 + x7 + x6 + x4 + x2 + 1
    const byte poly = 0xd5;

    public static byte ComputeChecksum(params byte[] bytes ) {
        byte crc = 0;
        if ( bytes != null &amp;&amp; bytes.Length > 0 ) {
            foreach ( byte b in bytes ) {
                crc = table&#91;crc ^ b&#93;;
            }
        }
        return crc;
    } 

    static Crc8( ) {
        for ( int i = 0; i &lt; 256; ++i ) {
            int temp = i;
            for ( int j = 0; j &lt; 8; ++j ) {
                if ( ( temp &amp; 0x80 ) != 0 ) {
                    temp = ( temp &lt;&lt; 1 ) ^ poly;
                } else {
                    temp &lt;&lt;= 1;
                }
            }
            table&#91;i&#93; = (byte)temp;
        }
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Crc8</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">table</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000">&#91;</span><span style="color: #098658">256</span><span style="color: #000000">&#93;;</span></span>
<span class="line"><span style="color: #008000">    // x8 + x7 + x6 + x4 + x2 + 1</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">const</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">poly</span><span style="color: #000000"> = </span><span style="color: #098658">0xd5</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #795E26">ComputeChecksum</span><span style="color: #000000">(</span><span style="color: #0000FF">params</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">bytes</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #001080">bytes</span><span style="color: #000000"> != </span><span style="color: #0000FF">null</span><span style="color: #000000"> &amp;&amp; </span><span style="color: #001080">bytes</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000"> &gt; </span><span style="color: #098658">0</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">foreach</span><span style="color: #000000"> ( </span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">b</span><span style="color: #000000"> </span><span style="color: #AF00DB">in</span><span style="color: #000000"> </span><span style="color: #001080">bytes</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">crc</span><span style="color: #000000"> = </span><span style="color: #001080">table</span><span style="color: #000000">&#91;</span><span style="color: #001080">crc</span><span style="color: #000000"> ^ </span><span style="color: #001080">b</span><span style="color: #000000">&#93;;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    } </span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #795E26">Crc8</span><span style="color: #000000">( ) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">for</span><span style="color: #000000"> ( </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">i</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">i</span><span style="color: #000000"> &lt; </span><span style="color: #098658">256</span><span style="color: #000000">; ++</span><span style="color: #001080">i</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">temp</span><span style="color: #000000"> = </span><span style="color: #001080">i</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">for</span><span style="color: #000000"> ( </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">j</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">j</span><span style="color: #000000"> &lt; </span><span style="color: #098658">8</span><span style="color: #000000">; ++</span><span style="color: #001080">j</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( ( </span><span style="color: #001080">temp</span><span style="color: #000000"> &amp; </span><span style="color: #098658">0x80</span><span style="color: #000000"> ) != </span><span style="color: #098658">0</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">temp</span><span style="color: #000000"> = ( </span><span style="color: #001080">temp</span><span style="color: #000000"> &lt;&lt; </span><span style="color: #098658">1</span><span style="color: #000000"> ) ^ </span><span style="color: #001080">poly</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">temp</span><span style="color: #000000"> &lt;&lt;= </span><span style="color: #098658">1</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">table</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">&#93; = (</span><span style="color: #0000FF">byte</span><span style="color: #000000">)</span><span style="color: #001080">temp</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>This one differs slightly (API wise) from my previous ones, mainly because I was using it for check-summing smaller bits of data, so I made the <code>ComputeChecksum</code> method a params argument instead of a first class array type.<br><br>Here&#8217;s a sample of how I was using it (and testing it):</p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>byte crc = Crc8.ComputeChecksum( 1, 2, 3 );
byte check = Crc8.ComputeChecksum( 1, 2, 3, crc );
// here check should equal 0 to show that the checksum is accurate
if ( check != 0 ) {
    Console.WriteLine( "Error in the checksum" );
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000"> = </span><span style="color: #001080">Crc8</span><span style="color: #000000">.</span><span style="color: #795E26">ComputeChecksum</span><span style="color: #000000">( </span><span style="color: #098658">1</span><span style="color: #000000">, </span><span style="color: #098658">2</span><span style="color: #000000">, </span><span style="color: #098658">3</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">check</span><span style="color: #000000"> = </span><span style="color: #001080">Crc8</span><span style="color: #000000">.</span><span style="color: #795E26">ComputeChecksum</span><span style="color: #000000">( </span><span style="color: #098658">1</span><span style="color: #000000">, </span><span style="color: #098658">2</span><span style="color: #000000">, </span><span style="color: #098658">3</span><span style="color: #000000">, </span><span style="color: #001080">crc</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #008000">// here check should equal 0 to show that the checksum is accurate</span></span>
<span class="line"><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #001080">check</span><span style="color: #000000"> != </span><span style="color: #098658">0</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #001080">Console</span><span style="color: #000000">.</span><span style="color: #795E26">WriteLine</span><span style="color: #000000">( </span><span style="color: #A31515">&quot;Error in the checksum&quot;</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>I&#8217;ve consolidated all of these into a single library on <a href="https://github.com/nullfx/NullFX.CRC" target="_blank" rel="noreferrer noopener">GitHub here: NullFX.CRC</a>.<br><br>I&#8217;m also very into Swift at the moment and have created Swift versions of these same classes and released a Swift PM version of this library here as well <a href="https://github.com/nullfx/NullfxCrc" target="_blank" rel="noreferrer noopener">Swift NullfxCrc Package</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Pre-increment vs post-increment operators</title>
		<link>http://www.sanity-free.com/preincrement_vs_postincrement_operators.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Wed, 17 Dec 2008 18:00:00 +0000</pubDate>
				<category><![CDATA[C# Articles]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=236</guid>

					<description><![CDATA[OK, so here&#8217;s a question for you that most people should have learned in school, but didn&#8217;t. You have to answer this without running to visual studio. Is it A) 1 2 3 4 or B) 0 1 2 3 4 I&#8217;m sure there are quite a few who would choose A, but this is [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>OK, so here&#8217;s a question for you that most people should have learned in school, but didn&#8217;t. You have to answer this without running to visual studio.<br></p>



<ol class="wp-block-list">
<li>What is the difference between ++i and i++?</li>



<li>What is the output of the following piece of code:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>for(int i = 0; i &lt; 5; ++i) {
    Console.WriteLine(i);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">i</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">i</span><span style="color: #000000"> &lt; </span><span style="color: #098658">5</span><span style="color: #000000">; ++</span><span style="color: #001080">i</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #001080">Console</span><span style="color: #000000">.</span><span style="color: #795E26">WriteLine</span><span style="color: #000000">(</span><span style="color: #001080">i</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>Is it A)</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>1
2
3
4</p>
</blockquote>



<p>or B)</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>0
1
2
3
4</p>
</blockquote>



<p>I&#8217;m sure there are quite a few who would choose A, but this is in fact incorrect (go ahead and run it in visual studio now).<br><br>Most of us when we learned C style programming were taught that pre-increment increments the value before taking the value, and that post increment takes the value then increments. After being taught that, pretty much every professor, every code sample, and everybody under the sun used post increment for every single iterative example in existence.<br><br>Question is&#8230; WHY?<br><br>Inside a loop, I cannot see why anyone would use post increment. What is the order of operation? Declare, loop body, compare, increment, loop body, compare, increment, &#8230;.<br><br>Unlike C++ (where there are there are actually 2 distinct operators: a pre and a post increment operator) C#, has only one generic &#8220;increment&#8221; / &#8220;decrement&#8221; operator, so exactly how the operator works is left completely out of our hands (and is handled internally by the framework). As stated in the ECMA spec (page 176 of the 4<sup>th</sup> edition of the ECMA-334):</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>The run-time processing of a postfix increment or decrement operation of the form x++ or x&#8211; consists of the following steps:</p>



<ul class="wp-block-list">
<li>If x is classified as a variable:
<ul class="wp-block-list">
<li>x is evaluated to produce the variable.</li>



<li>The value of x is saved.</li>



<li>The saved value of x is converted to the operand type of the selected operator and the operator is invoked with this value as its argument.</li>



<li>The value returned by the operator is converted to the type of x and stored in the location given by the evaluation of x.</li>



<li>The saved value of x becomes the result of the operation.</li>
</ul>
</li>
</ul>
</blockquote>



<p>By comparison, here is what is stated for a pre-increment operation (page 196 of ECMA-334 4<sup>th</sup> edition):</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>The run-time processing of a prefix increment or decrement operation of the form ++x or &#8211;x consists of the following steps:</p>



<ul class="wp-block-list">
<li>If x is classified as a variable:
<ul class="wp-block-list">
<li>x is evaluated to produce the variable.</li>



<li>The value of x is converted to the operand type of the selected operator and the operator is invoked with this value as its argument.</li>



<li>The value returned by the operator is converted to the type of x. The resulting value is stored in the location given by the evaluation of x and becomes the result of the operation.</li>
</ul>
</li>
</ul>
</blockquote>



<p>So in the case of post increment, a copy has to be made, the op_Increment is invoked using the copy, the value is returned, and the copy overwrites the original value.<br><br>With pre-increment, the value is passed into the op_Increment method, and its value is returned.<br><br>In the case of a loop, we are not using the value returned pre-increment, and are therefore only using the increment operation to alter the original value, so using post increment is completely pointless. Why anyone uses it is beyond me. Maybe its a case of not actually understanding whats going on.<br><br>There are a few places where it actually makes sense to use a post increment operation, but even these probably have better solutions to them as well:</p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>int i = 0;
int j = i++;
// or
int[] table = { 0, 1, 2, 3, 4, 5, 6 };
int i = 0;
int j = table&#91;i++&#93;;
int k = table&#91;i++&#93;;
int l = table&#91;i++&#93;;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">i</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">j</span><span style="color: #000000"> = </span><span style="color: #001080">i</span><span style="color: #000000">++;</span></span>
<span class="line"><span style="color: #008000">// or</span></span>
<span class="line"><span style="color: #0000FF">int</span><span style="color: #000000">[] </span><span style="color: #001080">table</span><span style="color: #000000"> = { </span><span style="color: #098658">0</span><span style="color: #000000">, </span><span style="color: #098658">1</span><span style="color: #000000">, </span><span style="color: #098658">2</span><span style="color: #000000">, </span><span style="color: #098658">3</span><span style="color: #000000">, </span><span style="color: #098658">4</span><span style="color: #000000">, </span><span style="color: #098658">5</span><span style="color: #000000">, </span><span style="color: #098658">6</span><span style="color: #000000"> };</span></span>
<span class="line"><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">i</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">j</span><span style="color: #000000"> = </span><span style="color: #001080">table</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">++&#93;;</span></span>
<span class="line"><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">k</span><span style="color: #000000"> = </span><span style="color: #001080">table</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">++&#93;;</span></span>
<span class="line"><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">l</span><span style="color: #000000"> = </span><span style="color: #001080">table</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">++&#93;;</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>So the moral of the story is&#8230; post increment wisely (have a good reason to use it, otherwise pre-increment).</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>A C# Command Line Args processing class</title>
		<link>http://www.sanity-free.com/csharp_command_line_args_processing_class.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Wed, 30 Jan 2008 18:00:00 +0000</pubDate>
				<category><![CDATA[C# Articles]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=234</guid>

					<description><![CDATA[The other day I was working on our video game&#8217;s content server app. The way its set up is fairly complicated. It basically has 3 modes that it can run in (as a windows service, as a fully blown console shell, or as a windows application). Being tired of writing long ugly blocks of code [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>The other day I was working on our video game&#8217;s content server app. The way its set up is fairly complicated. It basically has 3 modes that it can run in (as a windows service, as a fully blown console shell, or as a windows application).<br><br>Being tired of writing long ugly blocks of code for command line arg&#8217;s processing, I decided to build out an object (not at all like my last command line parser class) that would manage the command line args in an intuitive manner.<br><br>There are Three basic ways to use this class:</p>



<ol class="wp-block-list">
<li>Sort of like a dictionary</li>



<li>With one big event handler</li>



<li>By registering specific event handlers</li>
</ol>



<p>What I typically do is add the args that are passed into the main function into an arraylist or List&lt;string&gt; and simply ask if the list contains this switch or that switch:</p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>static class Program {
    static void Main(string[] args) {
        List&lt;string> cmdArgs = new List&lt;string>(args);
        if(cmdArgs.Contains("/myswitch"))) {
            // ... whatever ...
        }
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Program</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">Main</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000">[] </span><span style="color: #001080">args</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #267F99">List</span><span style="color: #000000">&lt;</span><span style="color: #0000FF">string</span><span style="color: #000000">&gt; </span><span style="color: #001080">cmdArgs</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">List</span><span style="color: #000000">&lt;</span><span style="color: #0000FF">string</span><span style="color: #000000">&gt;(</span><span style="color: #001080">args</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">cmdArgs</span><span style="color: #000000">.</span><span style="color: #795E26">Contains</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;/myswitch&quot;</span><span style="color: #000000">))) {</span></span>
<span class="line"><span style="color: #008000">            // ... whatever ...</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>As you can see, it still takes quite a bit of code. My first iteration of my <code>CommandLineArgs</code> class parsed out the command line switches and placed everything in a dictionary</p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>static class Program {
    static void Main(string[] args) {
        CommandLineArgs cmdArgs = new CommandLineArgs();
        cmdArgs.IgnoreCase = true;
        // this adds a switch prefix regular expression used to determine 
        // what is a switch and what is not.whats passed in is a normal Regex pattern.
        cmdArgs.PrefixRegexPatternList.Add("/{1}");   // forward slash or 
        cmdArgs.PrefixRegexPatternList.Add("-{1,2}"); // - / -- options
        cmdArgs.ProcessCommandLineArgs(args);
        if(cmdArgs.ContainsSwitch("myswitch"))) {
            // ... whatever ...
        }
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Program</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">Main</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000">[] </span><span style="color: #001080">args</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #267F99">CommandLineArgs</span><span style="color: #000000"> </span><span style="color: #001080">cmdArgs</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">CommandLineArgs</span><span style="color: #000000">();</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #001080">cmdArgs</span><span style="color: #000000">.</span><span style="color: #001080">IgnoreCase</span><span style="color: #000000"> = </span><span style="color: #0000FF">true</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #008000">        // this adds a switch prefix regular expression used to determine </span></span>
<span class="line"><span style="color: #008000">        // what is a switch and what is not.whats passed in is a normal Regex pattern.</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #001080">cmdArgs</span><span style="color: #000000">.</span><span style="color: #001080">PrefixRegexPatternList</span><span style="color: #000000">.</span><span style="color: #795E26">Add</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;/{1}&quot;</span><span style="color: #000000">);   </span><span style="color: #008000">// forward slash or </span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #001080">cmdArgs</span><span style="color: #000000">.</span><span style="color: #001080">PrefixRegexPatternList</span><span style="color: #000000">.</span><span style="color: #795E26">Add</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;-{1,2}&quot;</span><span style="color: #000000">); </span><span style="color: #008000">// - / -- options</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #001080">cmdArgs</span><span style="color: #000000">.</span><span style="color: #795E26">ProcessCommandLineArgs</span><span style="color: #000000">(</span><span style="color: #001080">args</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">cmdArgs</span><span style="color: #000000">.</span><span style="color: #795E26">ContainsSwitch</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;myswitch&quot;</span><span style="color: #000000">))) {</span></span>
<span class="line"><span style="color: #008000">            // ... whatever ...</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>But that was pretty much just like using the list like I had been doing.<br><br>The next iteration added a <code>SwitchMatch</code> event so that when <code>ProcessCommandLineArgs</code> was called, as switches were parsed, it would kick of an event for each match, providing the switch name (minus the switch prefix) and the value of that switch.</p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>static class Program {
    static void Main(string[] args) {
        CommandLineArgs cmdArgs = new CommandLineArgs();
        cmdArgs.IgnoreCase = true;
        cmdArgs.PrefixRegexPatternList.Add("/{1}");
        cmdArgs.PrefixRegexPatternList.Add("-{1,2}");
        cmdArgs.SwitchMatch += (sender, e) => {
            if(!e.IsValidSwitch) return
            switch(e.Switch) {
                case "foo": {
                    // ... handle the /foo -foo or --foo switch logic here ...
                } break;
            }
        };
        cmdArgs.ProcessCommandLineArgs(args);
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Program</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">Main</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000">[] </span><span style="color: #001080">args</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #267F99">CommandLineArgs</span><span style="color: #000000"> </span><span style="color: #001080">cmdArgs</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">CommandLineArgs</span><span style="color: #000000">();</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #001080">cmdArgs</span><span style="color: #000000">.</span><span style="color: #001080">IgnoreCase</span><span style="color: #000000"> = </span><span style="color: #0000FF">true</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #001080">cmdArgs</span><span style="color: #000000">.</span><span style="color: #001080">PrefixRegexPatternList</span><span style="color: #000000">.</span><span style="color: #795E26">Add</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;/{1}&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #001080">cmdArgs</span><span style="color: #000000">.</span><span style="color: #001080">PrefixRegexPatternList</span><span style="color: #000000">.</span><span style="color: #795E26">Add</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;-{1,2}&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #001080">cmdArgs</span><span style="color: #000000">.</span><span style="color: #001080">SwitchMatch</span><span style="color: #000000"> += (</span><span style="color: #001080">sender</span><span style="color: #000000">, </span><span style="color: #001080">e</span><span style="color: #000000">) =&gt; {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(!</span><span style="color: #001080">e</span><span style="color: #000000">.</span><span style="color: #001080">IsValidSwitch</span><span style="color: #000000">) </span><span style="color: #AF00DB">return</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">switch</span><span style="color: #000000">(</span><span style="color: #001080">e</span><span style="color: #000000">.</span><span style="color: #001080">Switch</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">case</span><span style="color: #000000"> </span><span style="color: #A31515">&quot;foo&quot;</span><span style="color: #000000">: {</span></span>
<span class="line"><span style="color: #008000">                    // ... handle the /foo -foo or --foo switch logic here ...</span></span>
<span class="line"><span style="color: #000000">                } </span><span style="color: #AF00DB">break</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        };</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #001080">cmdArgs</span><span style="color: #000000">.</span><span style="color: #795E26">ProcessCommandLineArgs</span><span style="color: #000000">(</span><span style="color: #001080">args</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>By the way, I&#8217;m using .NET 3.5 here (notice the nice lambda event handler there&#8230; yes, I am lazy and lambda&#8217;s lend themselves nicely to how I do things) if you couldn&#8217;t tell. If you&#8217;re using .NET 1.1 or 2.0 then you can just create an event handler like you normally would.<br><br>This worked nicely. Only problem now is that I have to have the huge switch statement in my main class. So in the next iteration I decided it would be nice to be able to register specific switch handlers (one for &#8220;/foo&#8221;, one for &#8220;&#8211;bar&#8221; and so on.<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>static class Program {
    static void Main(string[] args) {
        CommandLineArgs cmdArgs = new CommandLineArgs();
        cmdArgs.IgnoreCase = true;
        cmdArgs.PrefixRegexPatternList.Add("/{1}");
        cmdArgs.PrefixRegexPatternList.Add("-{1,2}");
        cmdArgs.RegisterSpecificSwitchMatchHandler("foo", (sender, e) => {
            // handle the /foo -foo or --foo switch logic here.
            // this method will only be called for the foo switch.
        });
        cmdArgs.ProcessCommandLineArgs(args);
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Program</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">Main</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000">[] </span><span style="color: #001080">args</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #267F99">CommandLineArgs</span><span style="color: #000000"> </span><span style="color: #001080">cmdArgs</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">CommandLineArgs</span><span style="color: #000000">();</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #001080">cmdArgs</span><span style="color: #000000">.</span><span style="color: #001080">IgnoreCase</span><span style="color: #000000"> = </span><span style="color: #0000FF">true</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #001080">cmdArgs</span><span style="color: #000000">.</span><span style="color: #001080">PrefixRegexPatternList</span><span style="color: #000000">.</span><span style="color: #795E26">Add</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;/{1}&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #001080">cmdArgs</span><span style="color: #000000">.</span><span style="color: #001080">PrefixRegexPatternList</span><span style="color: #000000">.</span><span style="color: #795E26">Add</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;-{1,2}&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #001080">cmdArgs</span><span style="color: #000000">.</span><span style="color: #795E26">RegisterSpecificSwitchMatchHandler</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;foo&quot;</span><span style="color: #000000">, (</span><span style="color: #001080">sender</span><span style="color: #000000">, </span><span style="color: #001080">e</span><span style="color: #000000">) =&gt; {</span></span>
<span class="line"><span style="color: #008000">            // handle the /foo -foo or --foo switch logic here.</span></span>
<span class="line"><span style="color: #008000">            // this method will only be called for the foo switch.</span></span>
<span class="line"><span style="color: #000000">        });</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #001080">cmdArgs</span><span style="color: #000000">.</span><span style="color: #795E26">ProcessCommandLineArgs</span><span style="color: #000000">(</span><span style="color: #001080">args</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>One other item I should also note is that there is also an <code>InvalidArgs</code> array too. On the events, there is an <code>IsValidSwitch</code> property that will let you know whether or not the switch is valid or not (since the <code>SwitchMatch</code> event is triggered whether or not the switch is valid) so if your command line contains any values that are not directly tied to a switch. For instance if you don&#8217;t quote a string with spaces: <em>/foo this is a string</em> like this <em>/foo &#8220;this is a string&#8221;</em> then /foo&#8217;s value will be &#8220;this&#8221; and is, a, string will all be contained in the invalid args list. If you use a switch prefix not accounted for in your prefix regex list, it will also be added to your <code>InvalidArgs</code> list (ex: <em>yourapp.exe ^switch &#8220;values&#8221;</em> both <em>^switch</em> and <em>values</em> will be placed in your <code>InvalidArgs</code> list.<br><br>This class accepts the following formats:</p>



<ul class="wp-block-list">
<li>&lt;switch prefix>switch=value</li>



<li>&lt;switch prefix>switch value</li>
</ul>



<p>So in the spirit of sharing, here is my <code>CommandLineArgs</code> class:</p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(3 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class CommandLineArgs {
    public const string InvalidSwitchIdentifier = "INVALID";
    List&lt;string> prefixRegexPatternList = new List&lt;string>();
    Dictionary&lt;string, string> arguments = new Dictionary&lt;string, string>();
    List&lt;string> invalidArgs = new List&lt;string>();
    Dictionary&lt;string, EventHandler&lt;CommandLineArgsMatchEventArgs>> handlers = 
        new Dictionary&lt;string, EventHandler&lt;CommandLineArgsMatchEventArgs>>();
    bool ignoreCase = true;

    public event EventHandler&lt;CommandLineArgsMatchEventArgs> SwitchMatch;

    public int ArgCount { get { return arguments.Keys.Count; } }

    public List&lt;string> PrefixRegexPatternList {
        get { return prefixRegexPatternList; }
    }

    public bool IgnoreCase {
        get { return ignoreCase; }
        set { ignoreCase = value; }
    }

    public string[] InvalidArgs {
        get { return invalidArgs.ToArray(); }
    }

    public string this&#91;string key&#93; {
        get {
            if (ContainsSwitch(key)) return arguments&#91;key&#93;;
            return null ;
        }
    }

    protected virtual void OnSwitchMatch(CommandLineArgsMatchEventArgs e) {
        if (handlers.ContainsKey(e.Switch) &amp;&amp; handlers&#91;e.Switch&#93; != null ) handlers&#91;e.Switch&#93;(this, e);
        else if (SwitchMatch != null ) SwitchMatch(this, e);
    }

    public void RegisterSpecificSwitchMatchHandler(string switchName, EventHandler&lt;CommandLineArgsMatchEventArgs> handler) {
        if (handlers.ContainsKey(switchName)) handlers&#91;switchName&#93; = handler;
        else handlers.Add(switchName, handler);
    }

    public bool ContainsSwitch(string switchName) {
        foreach (string pattern in prefixRegexPatternList) {
            if (Regex.IsMatch(switchName, pattern, RegexOptions.Compiled)) {
                switchName = Regex.Replace(switchName, pattern, "", RegexOptions.Compiled);
            }
        }
        if (ignoreCase) {
            foreach (string key in arguments.Keys) {
                if (key.ToLower() == switchName.ToLower()) return true;
            }
        } else {
            return arguments.ContainsKey(switchName);
        }
        return false;
    }

    public void ProcessCommandLineArgs(string[] args) {
        for (int i = 0; i &lt; args.Length; i++) {
            string value = ignoreCase ? args&#91;i&#93;.ToLower() : args&#91;i&#93;;
            foreach (string prefix in prefixRegexPatternList) {
                string pattern = string.Format("^{0}", prefix);
                if (Regex.IsMatch(value, pattern, RegexOptions.Compiled)) {
                    value = Regex.Replace(value, pattern, "", RegexOptions.Compiled);
                    if (value.Contains("=")) { // "&lt;prefix>Param=Value"
                        int idx = value.IndexOf('=');
                        string n = value.Substring(0, idx);
                        string v = value.Substring(idx + 1, value.Length - n.Length - 1);
                        OnSwitchMatch(new CommandLineArgsMatchEventArgs(n, v));
                        arguments.Add(n, v);
                    } else { // "&lt;prefix>Param Value"
                        if (i + 1 &lt; args.Length) {
                            string @switch = value;
                            string val  = args&#91;i + 1&#93;;
                            OnSwitchMatch(new CommandLineArgsMatchEventArgs(@switch, val));
                            arguments.Add(value, val);
                            i++;
                        } else {
                            OnSwitchMatch(new CommandLineArgsMatchEventArgs(value, null ));
                            arguments.Add(value, null );
                        }
                    }
                } else { // invalid arg ...
                    OnSwitchMatch( new CommandLineArgsMatchEventArgs( 
                        InvalidSwitchIdentifier, value, false));
                    invalidArgs.Add(value);
                }
            }
        }
    }
}

public class CommandLineArgsMatchEventArgs : EventArgs {
    string @switch;
    string value;
    bool isValidSwitch = true;

    public string Switch {
        get { return @switch; } 
    }

    public string Value {
        get { return value; }
    }

    public bool IsValidSwitch {
        get { return isValidSwitch; }
    }

    public CommandLineArgsMatchEventArgs(string @switch, string value)
        : this(@switch, value, true) { }

    public CommandLineArgsMatchEventArgs(string @switch, string value, bool isValidSwitch) {
        this.@switch = @switch;
        this.value = value;
        this.isValidSwitch = isValidSwitch;
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Collections</span><span style="color: #000000">.</span><span style="color: #267F99">Generic</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Text</span><span style="color: #000000">.</span><span style="color: #267F99">RegularExpressions</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">CommandLineArgs</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">const</span><span style="color: #000000"> </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">InvalidSwitchIdentifier</span><span style="color: #000000"> = </span><span style="color: #A31515">&quot;INVALID&quot;</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #267F99">List</span><span style="color: #000000">&lt;</span><span style="color: #0000FF">string</span><span style="color: #000000">&gt; </span><span style="color: #001080">prefixRegexPatternList</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">List</span><span style="color: #000000">&lt;</span><span style="color: #0000FF">string</span><span style="color: #000000">&gt;();</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #267F99">Dictionary</span><span style="color: #000000">&lt;</span><span style="color: #0000FF">string</span><span style="color: #000000">, </span><span style="color: #0000FF">string</span><span style="color: #000000">&gt; </span><span style="color: #001080">arguments</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">Dictionary</span><span style="color: #000000">&lt;</span><span style="color: #0000FF">string</span><span style="color: #000000">, </span><span style="color: #0000FF">string</span><span style="color: #000000">&gt;();</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #267F99">List</span><span style="color: #000000">&lt;</span><span style="color: #0000FF">string</span><span style="color: #000000">&gt; </span><span style="color: #001080">invalidArgs</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">List</span><span style="color: #000000">&lt;</span><span style="color: #0000FF">string</span><span style="color: #000000">&gt;();</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #267F99">Dictionary</span><span style="color: #000000">&lt;</span><span style="color: #0000FF">string</span><span style="color: #000000">, </span><span style="color: #267F99">EventHandler</span><span style="color: #000000">&lt;</span><span style="color: #267F99">CommandLineArgsMatchEventArgs</span><span style="color: #000000">&gt;&gt; </span><span style="color: #001080">handlers</span><span style="color: #000000"> = </span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">Dictionary</span><span style="color: #000000">&lt;</span><span style="color: #0000FF">string</span><span style="color: #000000">, </span><span style="color: #267F99">EventHandler</span><span style="color: #000000">&lt;</span><span style="color: #267F99">CommandLineArgsMatchEventArgs</span><span style="color: #000000">&gt;&gt;();</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">ignoreCase</span><span style="color: #000000"> = </span><span style="color: #0000FF">true</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">event</span><span style="color: #000000"> </span><span style="color: #267F99">EventHandler</span><span style="color: #000000">&lt;</span><span style="color: #267F99">CommandLineArgsMatchEventArgs</span><span style="color: #000000">&gt; </span><span style="color: #001080">SwitchMatch</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">ArgCount</span><span style="color: #000000"> { </span><span style="color: #0000FF">get</span><span style="color: #000000"> { </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">arguments</span><span style="color: #000000">.</span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Count</span><span style="color: #000000">; } }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #267F99">List</span><span style="color: #000000">&lt;</span><span style="color: #0000FF">string</span><span style="color: #000000">&gt; </span><span style="color: #001080">PrefixRegexPatternList</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">get</span><span style="color: #000000"> { </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">prefixRegexPatternList</span><span style="color: #000000">; }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">IgnoreCase</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">get</span><span style="color: #000000"> { </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">ignoreCase</span><span style="color: #000000">; }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">set</span><span style="color: #000000"> { </span><span style="color: #001080">ignoreCase</span><span style="color: #000000"> = </span><span style="color: #001080">value</span><span style="color: #000000">; }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">string</span><span style="color: #000000">[] </span><span style="color: #001080">InvalidArgs</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">get</span><span style="color: #000000"> { </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">invalidArgs</span><span style="color: #000000">.</span><span style="color: #795E26">ToArray</span><span style="color: #000000">(); }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #0000FF">this</span><span style="color: #000000">&#91;</span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">key</span><span style="color: #000000">&#93; {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">get</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000"> (</span><span style="color: #795E26">ContainsSwitch</span><span style="color: #000000">(</span><span style="color: #001080">key</span><span style="color: #000000">)) </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">arguments</span><span style="color: #000000">&#91;</span><span style="color: #001080">key</span><span style="color: #000000">&#93;;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">null</span><span style="color: #000000"> ;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">protected</span><span style="color: #000000"> </span><span style="color: #0000FF">virtual</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">OnSwitchMatch</span><span style="color: #000000">(</span><span style="color: #267F99">CommandLineArgsMatchEventArgs</span><span style="color: #000000"> </span><span style="color: #001080">e</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000"> (</span><span style="color: #001080">handlers</span><span style="color: #000000">.</span><span style="color: #795E26">ContainsKey</span><span style="color: #000000">(</span><span style="color: #001080">e</span><span style="color: #000000">.</span><span style="color: #001080">Switch</span><span style="color: #000000">) &amp;&amp; </span><span style="color: #001080">handlers</span><span style="color: #000000">&#91;</span><span style="color: #001080">e</span><span style="color: #000000">.</span><span style="color: #001080">Switch</span><span style="color: #000000">&#93; != </span><span style="color: #0000FF">null</span><span style="color: #000000"> ) </span><span style="color: #001080">handlers</span><span style="color: #000000">&#91;</span><span style="color: #001080">e</span><span style="color: #000000">.</span><span style="color: #001080">Switch</span><span style="color: #000000">&#93;(</span><span style="color: #0000FF">this</span><span style="color: #000000">, </span><span style="color: #001080">e</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">else</span><span style="color: #000000"> </span><span style="color: #AF00DB">if</span><span style="color: #000000"> (</span><span style="color: #001080">SwitchMatch</span><span style="color: #000000"> != </span><span style="color: #0000FF">null</span><span style="color: #000000"> ) </span><span style="color: #795E26">SwitchMatch</span><span style="color: #000000">(</span><span style="color: #0000FF">this</span><span style="color: #000000">, </span><span style="color: #001080">e</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">RegisterSpecificSwitchMatchHandler</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">switchName</span><span style="color: #000000">, </span><span style="color: #267F99">EventHandler</span><span style="color: #000000">&lt;</span><span style="color: #267F99">CommandLineArgsMatchEventArgs</span><span style="color: #000000">&gt; </span><span style="color: #001080">handler</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000"> (</span><span style="color: #001080">handlers</span><span style="color: #000000">.</span><span style="color: #795E26">ContainsKey</span><span style="color: #000000">(</span><span style="color: #001080">switchName</span><span style="color: #000000">)) </span><span style="color: #001080">handlers</span><span style="color: #000000">&#91;</span><span style="color: #001080">switchName</span><span style="color: #000000">&#93; = </span><span style="color: #001080">handler</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">else</span><span style="color: #000000"> </span><span style="color: #001080">handlers</span><span style="color: #000000">.</span><span style="color: #795E26">Add</span><span style="color: #000000">(</span><span style="color: #001080">switchName</span><span style="color: #000000">, </span><span style="color: #001080">handler</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">ContainsSwitch</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">switchName</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">foreach</span><span style="color: #000000"> (</span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">pattern</span><span style="color: #000000"> </span><span style="color: #AF00DB">in</span><span style="color: #000000"> </span><span style="color: #001080">prefixRegexPatternList</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000"> (</span><span style="color: #001080">Regex</span><span style="color: #000000">.</span><span style="color: #795E26">IsMatch</span><span style="color: #000000">(</span><span style="color: #001080">switchName</span><span style="color: #000000">, </span><span style="color: #001080">pattern</span><span style="color: #000000">, </span><span style="color: #001080">RegexOptions</span><span style="color: #000000">.</span><span style="color: #001080">Compiled</span><span style="color: #000000">)) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">switchName</span><span style="color: #000000"> = </span><span style="color: #001080">Regex</span><span style="color: #000000">.</span><span style="color: #795E26">Replace</span><span style="color: #000000">(</span><span style="color: #001080">switchName</span><span style="color: #000000">, </span><span style="color: #001080">pattern</span><span style="color: #000000">, </span><span style="color: #A31515">&quot;&quot;</span><span style="color: #000000">, </span><span style="color: #001080">RegexOptions</span><span style="color: #000000">.</span><span style="color: #001080">Compiled</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000"> (</span><span style="color: #001080">ignoreCase</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">foreach</span><span style="color: #000000"> (</span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">key</span><span style="color: #000000"> </span><span style="color: #AF00DB">in</span><span style="color: #000000"> </span><span style="color: #001080">arguments</span><span style="color: #000000">.</span><span style="color: #001080">Keys</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000"> (</span><span style="color: #001080">key</span><span style="color: #000000">.</span><span style="color: #795E26">ToLower</span><span style="color: #000000">() == </span><span style="color: #001080">switchName</span><span style="color: #000000">.</span><span style="color: #795E26">ToLower</span><span style="color: #000000">()) </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">true</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">arguments</span><span style="color: #000000">.</span><span style="color: #795E26">ContainsKey</span><span style="color: #000000">(</span><span style="color: #001080">switchName</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">ProcessCommandLineArgs</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000">[] </span><span style="color: #001080">args</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">for</span><span style="color: #000000"> (</span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">i</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">i</span><span style="color: #000000"> &lt; </span><span style="color: #001080">args</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000">; </span><span style="color: #001080">i</span><span style="color: #000000">++) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000"> = </span><span style="color: #001080">ignoreCase</span><span style="color: #000000"> ? </span><span style="color: #001080">args</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">&#93;.</span><span style="color: #795E26">ToLower</span><span style="color: #000000">() : </span><span style="color: #001080">args</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">&#93;;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">foreach</span><span style="color: #000000"> (</span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">prefix</span><span style="color: #000000"> </span><span style="color: #AF00DB">in</span><span style="color: #000000"> </span><span style="color: #001080">prefixRegexPatternList</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">pattern</span><span style="color: #000000"> = </span><span style="color: #0000FF">string</span><span style="color: #000000">.</span><span style="color: #795E26">Format</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;^{0}&quot;</span><span style="color: #000000">, </span><span style="color: #001080">prefix</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000"> (</span><span style="color: #001080">Regex</span><span style="color: #000000">.</span><span style="color: #795E26">IsMatch</span><span style="color: #000000">(</span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #001080">pattern</span><span style="color: #000000">, </span><span style="color: #001080">RegexOptions</span><span style="color: #000000">.</span><span style="color: #001080">Compiled</span><span style="color: #000000">)) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">value</span><span style="color: #000000"> = </span><span style="color: #001080">Regex</span><span style="color: #000000">.</span><span style="color: #795E26">Replace</span><span style="color: #000000">(</span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #001080">pattern</span><span style="color: #000000">, </span><span style="color: #A31515">&quot;&quot;</span><span style="color: #000000">, </span><span style="color: #001080">RegexOptions</span><span style="color: #000000">.</span><span style="color: #001080">Compiled</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">if</span><span style="color: #000000"> (</span><span style="color: #001080">value</span><span style="color: #000000">.</span><span style="color: #795E26">Contains</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;=&quot;</span><span style="color: #000000">)) { </span><span style="color: #008000">// &quot;&lt;prefix&gt;Param=Value&quot;</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">idx</span><span style="color: #000000"> = </span><span style="color: #001080">value</span><span style="color: #000000">.</span><span style="color: #795E26">IndexOf</span><span style="color: #000000">(</span><span style="color: #A31515">&#39;=&#39;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">n</span><span style="color: #000000"> = </span><span style="color: #001080">value</span><span style="color: #000000">.</span><span style="color: #795E26">Substring</span><span style="color: #000000">(</span><span style="color: #098658">0</span><span style="color: #000000">, </span><span style="color: #001080">idx</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">v</span><span style="color: #000000"> = </span><span style="color: #001080">value</span><span style="color: #000000">.</span><span style="color: #795E26">Substring</span><span style="color: #000000">(</span><span style="color: #001080">idx</span><span style="color: #000000"> + </span><span style="color: #098658">1</span><span style="color: #000000">, </span><span style="color: #001080">value</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000"> - </span><span style="color: #001080">n</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000"> - </span><span style="color: #098658">1</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #795E26">OnSwitchMatch</span><span style="color: #000000">(</span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">CommandLineArgsMatchEventArgs</span><span style="color: #000000">(</span><span style="color: #001080">n</span><span style="color: #000000">, </span><span style="color: #001080">v</span><span style="color: #000000">));</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #001080">arguments</span><span style="color: #000000">.</span><span style="color: #795E26">Add</span><span style="color: #000000">(</span><span style="color: #001080">n</span><span style="color: #000000">, </span><span style="color: #001080">v</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                    } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> { </span><span style="color: #008000">// &quot;&lt;prefix&gt;Param Value&quot;</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #AF00DB">if</span><span style="color: #000000"> (</span><span style="color: #001080">i</span><span style="color: #000000"> + </span><span style="color: #098658">1</span><span style="color: #000000"> &lt; </span><span style="color: #001080">args</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                            </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">@switch</span><span style="color: #000000"> = </span><span style="color: #001080">value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                            </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">val</span><span style="color: #000000">  = </span><span style="color: #001080">args</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000"> + </span><span style="color: #098658">1</span><span style="color: #000000">&#93;;</span></span>
<span class="line"><span style="color: #000000">                            </span><span style="color: #795E26">OnSwitchMatch</span><span style="color: #000000">(</span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">CommandLineArgsMatchEventArgs</span><span style="color: #000000">(</span><span style="color: #001080">@switch</span><span style="color: #000000">, </span><span style="color: #001080">val</span><span style="color: #000000">));</span></span>
<span class="line"><span style="color: #000000">                            </span><span style="color: #001080">arguments</span><span style="color: #000000">.</span><span style="color: #795E26">Add</span><span style="color: #000000">(</span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #001080">val</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                            </span><span style="color: #001080">i</span><span style="color: #000000">++;</span></span>
<span class="line"><span style="color: #000000">                        } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                            </span><span style="color: #795E26">OnSwitchMatch</span><span style="color: #000000">(</span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">CommandLineArgsMatchEventArgs</span><span style="color: #000000">(</span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #0000FF">null</span><span style="color: #000000"> ));</span></span>
<span class="line"><span style="color: #000000">                            </span><span style="color: #001080">arguments</span><span style="color: #000000">.</span><span style="color: #795E26">Add</span><span style="color: #000000">(</span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #0000FF">null</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">                        }</span></span>
<span class="line"><span style="color: #000000">                    }</span></span>
<span class="line"><span style="color: #000000">                } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> { </span><span style="color: #008000">// invalid arg ...</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #795E26">OnSwitchMatch</span><span style="color: #000000">( </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">CommandLineArgsMatchEventArgs</span><span style="color: #000000">( </span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #001080">InvalidSwitchIdentifier</span><span style="color: #000000">, </span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #0000FF">false</span><span style="color: #000000">));</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">invalidArgs</span><span style="color: #000000">.</span><span style="color: #795E26">Add</span><span style="color: #000000">(</span><span style="color: #001080">value</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">CommandLineArgsMatchEventArgs</span><span style="color: #000000"> : </span><span style="color: #267F99">EventArgs</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">@switch</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">isValidSwitch</span><span style="color: #000000"> = </span><span style="color: #0000FF">true</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">Switch</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">get</span><span style="color: #000000"> { </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">@switch</span><span style="color: #000000">; } </span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">Value</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">get</span><span style="color: #000000"> { </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">; }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">IsValidSwitch</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">get</span><span style="color: #000000"> { </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">isValidSwitch</span><span style="color: #000000">; }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #795E26">CommandLineArgsMatchEventArgs</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">@switch</span><span style="color: #000000">, </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">)</span></span>
<span class="line"><span style="color: #000000">        : </span><span style="color: #0000FF">this</span><span style="color: #000000">(</span><span style="color: #001080">@switch</span><span style="color: #000000">, </span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #0000FF">true</span><span style="color: #000000">) { }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #795E26">CommandLineArgsMatchEventArgs</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">@switch</span><span style="color: #000000">, </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">isValidSwitch</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">this</span><span style="color: #000000">.</span><span style="color: #001080">@switch</span><span style="color: #000000"> = </span><span style="color: #001080">@switch</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">this</span><span style="color: #000000">.</span><span style="color: #001080">value</span><span style="color: #000000"> = </span><span style="color: #001080">value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">this</span><span style="color: #000000">.</span><span style="color: #001080">isValidSwitch</span><span style="color: #000000"> = </span><span style="color: #001080">isValidSwitch</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>C# .NET Single Instance Application</title>
		<link>http://www.sanity-free.com/csharp_dotnet_single_instance_application.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Tue, 05 Jun 2007 18:00:00 +0000</pubDate>
				<category><![CDATA[C# Articles]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=231</guid>

					<description><![CDATA[Today I wanted to refactor some code that prohibited my application from running multiple instances of itself. Previously I had use System.Diagnostics.Process to search for an instance of my myapp.exe in the process list. While this works, it brings on a lot of overhead, and I wanted something cleaner. Knowing that I could use a [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Today I wanted to refactor some code that prohibited my application from running multiple instances of itself.<br><br>Previously I had use <code>System.Diagnostics.Process</code> to search for an instance of my myapp.exe in the process list. While this works, it brings on a lot of overhead, and I wanted something cleaner.<br><br>Knowing that I could use a <code>mutex</code> for this (but never having done it before) I set out to cut down my code and simplify my life.<br><br>In the class of my application main I created a static named <code>Mutex</code> (the GUID is irrelevant, just a &#8220;globally unique name&#8221; that we can use for our application):<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>static class Program {
    static Mutex mutex = new Mutex(true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}");
    &#91;STAThread&#93;
    ...
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Program</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #267F99">Mutex</span><span style="color: #000000"> </span><span style="color: #001080">mutex</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">Mutex</span><span style="color: #000000">(</span><span style="color: #0000FF">true</span><span style="color: #000000">, </span><span style="color: #A31515">&quot;{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    &#91;</span><span style="color: #267F99">STAThread</span><span style="color: #000000">&#93;</span></span>
<span class="line"><span style="color: #000000">    ...</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>Having a named <code>mutex</code> allows us to stack synchronization across multiple threads and processes which is just the magic I&#8217;m looking for.<br><br><code>Mutex.WaitOne</code> has an overload that specifies an amount of time for us to wait. Since we&#8217;re not actually wanting to synchronizing our code (more just check if it is currently in use) we use the overload with two parameters: <code>Mutex.WaitOne(Timespan timeout, bool exitContext)</code>. Wait one returns true if it is able to enter, and false if it wasn&#8217;t. In this case, we don&#8217;t want to wait at all; If our mutex is being used, skip it, and move on, so we pass in <code>TimeSpan.Zero</code> (wait 0 milliseconds), and set the exitContext to true so we can exit the synchronization context before we try to acquire a lock on it. Using this, we wrap our <code>Application.Run</code> code inside something like this:<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>static class Program {
    static Mutex mutex = new Mutex ( true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}" );
    &#91;STAThread&#93;
    static void Main ( ) {
        if ( mutex.WaitOne( TimeSpan.Zero, true ) ) {
            Application.EnableVisualStyles ( );
            Application.SetCompatibleTextRenderingDefault ( false );
            Application.Run ( new Form1 ( ) );
            mutex.ReleaseMutex ( );
        } else {
            MessageBox.Show("only one instance at a time");
        }
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Program</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #267F99">Mutex</span><span style="color: #000000"> </span><span style="color: #001080">mutex</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">Mutex</span><span style="color: #000000"> ( </span><span style="color: #0000FF">true</span><span style="color: #000000">, </span><span style="color: #A31515">&quot;{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}&quot;</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">    &#91;</span><span style="color: #267F99">STAThread</span><span style="color: #000000">&#93;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">Main</span><span style="color: #000000"> ( ) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #001080">mutex</span><span style="color: #000000">.</span><span style="color: #795E26">WaitOne</span><span style="color: #000000">( </span><span style="color: #001080">TimeSpan</span><span style="color: #000000">.</span><span style="color: #001080">Zero</span><span style="color: #000000">, </span><span style="color: #0000FF">true</span><span style="color: #000000"> ) ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">Application</span><span style="color: #000000">.</span><span style="color: #795E26">EnableVisualStyles</span><span style="color: #000000"> ( );</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">Application</span><span style="color: #000000">.</span><span style="color: #795E26">SetCompatibleTextRenderingDefault</span><span style="color: #000000"> ( </span><span style="color: #0000FF">false</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">Application</span><span style="color: #000000">.</span><span style="color: #795E26">Run</span><span style="color: #000000"> ( </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">Form1</span><span style="color: #000000"> ( ) );</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">mutex</span><span style="color: #000000">.</span><span style="color: #795E26">ReleaseMutex</span><span style="color: #000000"> ( );</span></span>
<span class="line"><span style="color: #000000">        } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">MessageBox</span><span style="color: #000000">.</span><span style="color: #795E26">Show</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;only one instance at a time&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>So, if our app is running, <code>WaitOne</code> will return false, and we&#8217;ll get a message box.<br><br>Instead of showing a message box, I opted to utilize a little Win32 to notify my running instance that someone forgot that it was already running (by bringing itself to the top of all the other windows). To achieve this I used <a href="http://msdn2.microsoft.com/en-us/library/ms644944.aspx">PostMessage</a> to broadcast a custom message to every window (the custom message was registered with <a href="http://msdn2.microsoft.com/en-us/library/ms644947.aspx">RegisterWindowMessage</a> by my running application, which means only my application knows what it is) then my second instance exits. The running application instance would receive that notification and process it. In order to do that, I overrode <code>WndProc</code> in my main form and listened for my custom notification. When I received that notification I set the form&#8217;s <code>TopMost</code> property to true to bring it up on top.<br><br>Here is what I ended up with:<br><br><strong>Program.cs</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>static class Program {
    static Mutex mutex = new Mutex ( true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}" );
    &#91;STAThread&#93;
    static void Main ( ) {
        if ( mutex.WaitOne ( TimeSpan.Zero, true ) ) {
            Application.EnableVisualStyles ( );
            Application.SetCompatibleTextRenderingDefault ( false );
            Application.Run ( new Form1 ( ) );
            mutex.ReleaseMutex ( );
        } else {
            // send our Win32 message to make the currently running instance
            // jump on top of all the other windows
            NativeMethods.PostMessage (
                ( IntPtr ) NativeMethods.HWND_BROADCAST,
                NativeMethods.WM_SHOWME,
                IntPtr.Zero,
                IntPtr.Zero );
        }
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Program</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #267F99">Mutex</span><span style="color: #000000"> </span><span style="color: #001080">mutex</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">Mutex</span><span style="color: #000000"> ( </span><span style="color: #0000FF">true</span><span style="color: #000000">, </span><span style="color: #A31515">&quot;{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}&quot;</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">    &#91;</span><span style="color: #267F99">STAThread</span><span style="color: #000000">&#93;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">Main</span><span style="color: #000000"> ( ) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #001080">mutex</span><span style="color: #000000">.</span><span style="color: #795E26">WaitOne</span><span style="color: #000000"> ( </span><span style="color: #001080">TimeSpan</span><span style="color: #000000">.</span><span style="color: #001080">Zero</span><span style="color: #000000">, </span><span style="color: #0000FF">true</span><span style="color: #000000"> ) ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">Application</span><span style="color: #000000">.</span><span style="color: #795E26">EnableVisualStyles</span><span style="color: #000000"> ( );</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">Application</span><span style="color: #000000">.</span><span style="color: #795E26">SetCompatibleTextRenderingDefault</span><span style="color: #000000"> ( </span><span style="color: #0000FF">false</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">Application</span><span style="color: #000000">.</span><span style="color: #795E26">Run</span><span style="color: #000000"> ( </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">Form1</span><span style="color: #000000"> ( ) );</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">mutex</span><span style="color: #000000">.</span><span style="color: #795E26">ReleaseMutex</span><span style="color: #000000"> ( );</span></span>
<span class="line"><span style="color: #000000">        } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #008000">            // send our Win32 message to make the currently running instance</span></span>
<span class="line"><span style="color: #008000">            // jump on top of all the other windows</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">NativeMethods</span><span style="color: #000000">.</span><span style="color: #795E26">PostMessage</span><span style="color: #000000"> (</span></span>
<span class="line"><span style="color: #000000">                ( </span><span style="color: #267F99">IntPtr</span><span style="color: #000000"> ) </span><span style="color: #001080">NativeMethods</span><span style="color: #000000">.</span><span style="color: #001080">HWND_BROADCAST</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">NativeMethods</span><span style="color: #000000">.</span><span style="color: #001080">WM_SHOWME</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">IntPtr</span><span style="color: #000000">.</span><span style="color: #001080">Zero</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">IntPtr</span><span style="color: #000000">.</span><span style="color: #001080">Zero</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p><strong>NativeMethods.cs</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// this class just wraps some Win32 stuff that we're going to use
internal class NativeMethods {
    public const int HWND_BROADCAST = 0xffff;
    public static readonly int WM_SHOWME = RegisterWindowMessage ( "WM_SHOWME" );
    &#91;DllImport ( "user32" )&#93;
    public static extern bool PostMessage ( IntPtr hwnd, 
                                            int msg, 
                                            IntPtr wparam, 
                                            IntPtr lparam );
    &#91;DllImport ( "user32" )&#93;
    public static extern int RegisterWindowMessage ( string message );
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #008000">// this class just wraps some Win32 stuff that we&#39;re going to use</span></span>
<span class="line"><span style="color: #0000FF">internal</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">NativeMethods</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">const</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">HWND_BROADCAST</span><span style="color: #000000"> = </span><span style="color: #098658">0xffff</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">readonly</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">WM_SHOWME</span><span style="color: #000000"> = </span><span style="color: #795E26">RegisterWindowMessage</span><span style="color: #000000"> ( </span><span style="color: #A31515">&quot;WM_SHOWME&quot;</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">    &#91;</span><span style="color: #267F99">DllImport</span><span style="color: #000000"> ( </span><span style="color: #A31515">&quot;user32&quot;</span><span style="color: #000000"> )&#93;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">extern</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">PostMessage</span><span style="color: #000000"> ( </span><span style="color: #267F99">IntPtr</span><span style="color: #000000"> </span><span style="color: #001080">hwnd</span><span style="color: #000000">, </span></span>
<span class="line"><span style="color: #000000">                                            </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">msg</span><span style="color: #000000">, </span></span>
<span class="line"><span style="color: #000000">                                            </span><span style="color: #267F99">IntPtr</span><span style="color: #000000"> </span><span style="color: #001080">wparam</span><span style="color: #000000">, </span></span>
<span class="line"><span style="color: #000000">                                            </span><span style="color: #267F99">IntPtr</span><span style="color: #000000"> </span><span style="color: #001080">lparam</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">    &#91;</span><span style="color: #267F99">DllImport</span><span style="color: #000000"> ( </span><span style="color: #A31515">&quot;user32&quot;</span><span style="color: #000000"> )&#93;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">extern</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #795E26">RegisterWindowMessage</span><span style="color: #000000"> ( </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">message</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>and our Form1.cs (front side partial)</p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public partial class Form1 : Form {
    public Form1 ( ) {
        InitializeComponent ( );
    }

    protected override void WndProc ( ref Message m ) {

        // handle the WM_SHOWME message and bring 
        // this window to the top
        if ( m.Msg == NativeMethods.WM_SHOWME ) {
            ShowMe ( );
        }
        base.WndProc ( ref m );
    }

    private void ShowMe ( ) {
        if ( WindowState == FormWindowState.Minimized ) {
            WindowState = FormWindowState.Normal;
        }
        // get our current "TopMost" value (ours will always be false though)
        bool top = TopMost;
        // make our form jump to the top of everything
        TopMost = true;
        // set it back to whatever it was
        TopMost = top;
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">partial</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Form1</span><span style="color: #000000"> : </span><span style="color: #267F99">Form</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #795E26">Form1</span><span style="color: #000000"> ( ) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #795E26">InitializeComponent</span><span style="color: #000000"> ( );</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">protected</span><span style="color: #000000"> </span><span style="color: #0000FF">override</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">WndProc</span><span style="color: #000000"> ( </span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #267F99">Message</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000"> ) {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #008000">        // handle the WM_SHOWME message and bring </span></span>
<span class="line"><span style="color: #008000">        // this window to the top</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #001080">m</span><span style="color: #000000">.</span><span style="color: #001080">Msg</span><span style="color: #000000"> == </span><span style="color: #001080">NativeMethods</span><span style="color: #000000">.</span><span style="color: #001080">WM_SHOWME</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #795E26">ShowMe</span><span style="color: #000000"> ( );</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #795E26">WndProc</span><span style="color: #000000"> ( </span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">ShowMe</span><span style="color: #000000"> ( ) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #001080">WindowState</span><span style="color: #000000"> == </span><span style="color: #001080">FormWindowState</span><span style="color: #000000">.</span><span style="color: #001080">Minimized</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">WindowState</span><span style="color: #000000"> = </span><span style="color: #001080">FormWindowState</span><span style="color: #000000">.</span><span style="color: #001080">Normal</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #008000">        // get our current &quot;TopMost&quot; value (ours will always be false though)</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">top</span><span style="color: #000000"> = </span><span style="color: #001080">TopMost</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #008000">        // make our form jump to the top of everything</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #001080">TopMost</span><span style="color: #000000"> = </span><span style="color: #0000FF">true</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #008000">        // set it back to whatever it was</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #001080">TopMost</span><span style="color: #000000"> = </span><span style="color: #001080">top</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p><a href="https://github.com/nullfx/SingleInstanceApp" target="_blank" rel="noreferrer noopener">Browse this example on github</a>.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Creating Fake Enums</title>
		<link>http://www.sanity-free.com/creating_fake_enums.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Tue, 03 Apr 2007 18:00:29 +0000</pubDate>
				<category><![CDATA[C# Articles]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=229</guid>

					<description><![CDATA[In .NET Enums are a strongly typed flag-like object. Flags would normally defined as a macro, or constant variable. The trouble with typical numeric flags is that a) the coder using the flag may or may not know all of the possible values, or b) might accidentally type the wrong constant or macro. Since the [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>In .NET Enums are a strongly typed flag-like object. Flags would normally defined as a macro, or constant variable. The trouble with typical numeric flags is that a) the coder using the flag may or may not know all of the possible values, or b) might accidentally type the wrong constant or macro. Since the flag is just some magic number they may end up with a logic error that may be hard to find under certain circumstances. With Enums I can provide the same logic (some numeric flag) but create a type that I can use to enforce some subset of numbers that are checked at compile time, and can be verified at run time ( <code>Enum.IsDefined</code> ). As with everything, Enums have their faults. What if I want to extend some Enum object (polymorphic Enums?), or give it additional functionality or meta data. Yesterday at work we ran across a case where being able to extend an Enum was mandatory. All of our Enums have numeric and string values, and are typically written like:<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public enum Foo {
    &#91;FriendlyName("One Foo")&#93;
    One = 1,
    &#91;FriendlyName("Two Foo")&#93;
    Two = 2,
    &#91;FriendlyName("Three Foo")&#93;
    Three = 3
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">enum</span><span style="color: #000000"> </span><span style="color: #267F99">Foo</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    &#91;</span><span style="color: #267F99">FriendlyName</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;One Foo&quot;</span><span style="color: #000000">)&#93;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #001080">One</span><span style="color: #000000"> = </span><span style="color: #098658">1</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">    &#91;</span><span style="color: #267F99">FriendlyName</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;Two Foo&quot;</span><span style="color: #000000">)&#93;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #001080">Two</span><span style="color: #000000"> = </span><span style="color: #098658">2</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">    &#91;</span><span style="color: #267F99">FriendlyName</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;Three Foo&quot;</span><span style="color: #000000">)&#93;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #001080">Three</span><span style="color: #000000"> = </span><span style="color: #098658">3</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>the <code>FriendlyName</code> attribute enables you to have both a numeric flag value as well as some human readable value of the enum element other than &#8220;One&#8221; or &#8220;Two&#8221; or &#8220;SomeEnumValue&#8221;(ie: <code>Foo.One.ToString()</code>)<br><br>Our company uses code generation like most fish use water. We use Enums quite a bit and each Enum type and all of their values are stored in a database which is used by the code generation tool to generate 99% of our business and data layer code. Since our code is generated, if we go in and manually add additional values that don&#8217;t need to be stored in the database, our generation tool will blow away any hand written changes on every build. We would have killed to have something like a partial Enum, but alas, no such thing exists.<br><br>I set out to try to create a &#8220;Fake Enum&#8221; class that acted and felt like an Enum but allowed us to extend it by way of the partial class or inheritance. Well after a little poking around, inheritance flew out the window (just over complex without resorting to some generics base type), but the ability to do a partial fake Enum was definitely doable.<br><br>Here&#8217;s the code I came up with:<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(3 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>using System;
using System.ComponentModel;
using System.Globalization
using System.Reflection;

&#91;TypeConverter(typeof(FakeEnum.FakeEnumConverter))&#93;
public partial class FakeEnum {

    // typical "Enum" declarations, sort of like One = 1, Two = 2, Three
    public static readonly FakeEnum One = new FakeEnum(1, "One's Friendly Name");
    public static readonly FakeEnum Two = new FakeEnum(2, "Two's Friendly Name");
    public static readonly FakeEnum Three = new FakeEnum(3, "Three's Friendly Name");
    public static readonly FakeEnum Four = new FakeEnum(4);
    public static readonly FakeEnum Five = new FakeEnum(5);
    public static readonly FakeEnum Six = new FakeEnum(6);


    // implementation to provide "Enum" like functionality
    int value;
    string friendlyName;

    public string FriendlyName { get { return friendlyName; } }

    public override string ToString() {
        return ToString("");
    }

    public virtual string ToString(string format) {
        foreach(FieldInfo staticField in GetType().GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy)) {
            FakeEnum temp = staticField.GetValue(null) as FakeEnum;
            if(temp == null) continue;
            if(temp.value == value) {
                switch(format) {
                    case "fn": {
                        return temp.friendlyName;
                    }
                    default: {
                        return staticField.Name;
                    }
                }
            }
        }
        return base.ToString();
    }

    public override int GetHashCode() {
        return value.GetHashCode();
    }

    public override bool Equals(object obj) {
        if(object.ReferenceEquals(obj, null)) return false;
        FakeEnum temp = obj as FakeEnum;
        if(!object.ReferenceEquals(temp, null)) {
            return temp.value == value;
        } else {
            return false;
        }
    }

    public static object Parse(Type type, int value) {
        foreach(FieldInfo fieldInfo in type.GetFields(BindingFlags.FlattenHierarchy | BindingFlags.Static | BindingFlags.Public)) {
            FakeEnum enumValue = fieldInfo.GetValue(null) as FakeEnum;
            if(enumValue != null) {
                if(enumValue.value == value) {
                    return enumValue;
                }
            }
        }
        throw new ArgumentException(string.Format("{0} is not defined in {1}", value, type.Name));
    }

    public static object Parse(Type type, string value) {
        return Parse(type, value, false);
    }

    public static object Parse(Type type, string value, bool ignoreCase) {
        if(string.IsNullOrEmpty(value)) throw new ArgumentNullException("value was either null or empty");
        foreach(FieldInfo field in type.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy)) {
            bool isMatch = false;
            if(ignoreCase) {
                isMatch = StringComparer.InvariantCultureIgnoreCase.Compare(field.Name, value) == 0;
            } else {
                isMatch = StringComparer.InvariantCulture.Compare(field.Name, value) == 0;
            }
            if(isMatch) {
                FakeEnum temp = field.GetValue(null) as FakeEnum;
                if(temp == null) throw new InvalidOperationException(string.Format("{0} not convertable to {1}", type, typeof(FakeEnum)));
                object instance = Activator.CreateInstance(type, new object[] { temp.value, temp.friendlyName });
                return instance;
            }
        }
        throw new ArgumentException(string.Format("{0} is not defined in {1}", value, type.Name));
    }

    public static bool IsDefined(Type type, object value) {
        if(object.ReferenceEquals(value, null)) throw new ArgumentNullException("value");
        if(typeof(FakeEnum).IsAssignableFrom(type)) {
            return IsDefined(type, ((FakeEnum)value).value);
        }
        return false;
    }

    public static bool IsDefined(Type type, int value) {
        foreach(FieldInfo staticField in type.GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy)) {
            object temp = staticField.GetValue(null);
            if(temp == null) continue;
            if(typeof(FakeEnum).IsAssignableFrom(type)) {
                if(((FakeEnum)temp).value == value) return true;
            }
        }
        return false;
    }

    public static bool IsDefined(Type type, string value) {
        return IsDefined(type, value, false);
    }

    public static bool IsDefined(Type type, string value, bool ignoreCase) {
        foreach(FieldInfo staticField in type.GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy)) {
            bool isMatch = false;
            if(ignoreCase) {
                isMatch = StringComparer.InvariantCultureIgnoreCase.Compare(staticField.Name, value) == 0;
            } else {
                isMatch = StringComparer.InvariantCulture.Compare(staticField.Name, value) == 0;
            }
            if(isMatch) return true;
        }
        return false;
    }

    public static explicit operator FakeEnum(int value) {
        foreach(FieldInfo staticField in typeof(FakeEnum).GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy)) {
            FakeEnum temp = staticField.GetValue(null) as FakeEnum;
            if(null == temp) continue;
            if(temp.value == value) return temp;
        }
        return null;
    }

    public static explicit operator int(FakeEnum fakeEnum) {
        return fakeEnum.value;
    }

    public static implicit operator FakeEnum(string value) {
        if(string.IsNullOrEmpty(value)) return null;
        foreach(FieldInfo field in typeof(FakeEnum).GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy)) {
            if(StringComparer.InvariantCultureIgnoreCase.Compare(field.Name, value) == 0) {
                FakeEnum temp = field.GetValue(null) as FakeEnum;
                if( null == temp) throw new InvalidOperationException(string.Format("{0} not convertable to {1}", value, typeof(FakeEnum)));
                FakeEnum instance = new FakeEnum(temp.value, temp.friendlyName);
                return instance;
            }
        }
        return null;
    }

    public static bool operator == (FakeEnum a, FakeEnum b) { 
        if(object.ReferenceEquals(a, null)) return false;      
        return a.Equals(b);
    }

    public static bool operator != (FakeEnum a, FakeEnum b) { 
        if(object.ReferenceEquals(a, null)) return true;
        return !a.Equals(b);
    }

    protected FakeEnum(int value) : this(value, null) { }

    protected FakeEnum(int value, string friendlyName) {
        this.value = value;
        this.friendlyName = friendlyName;
        if(string.IsNullOrEmpty(friendlyName)) {
            this.friendlyName = ToString();
        }
    }

    public class FakeEnumConverter : TypeConverter {
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) {
            if(value is string) {
                return (FakeEnum)((string)value);
            }
            return base.ConvertFrom(context, culture, value);
        }
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">ComponentModel</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Globalization</span></span>
<span class="line"><span style="color: #267F99">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Reflection</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">&#91;</span><span style="color: #267F99">TypeConverter</span><span style="color: #000000">(</span><span style="color: #0000FF">typeof</span><span style="color: #000000">(</span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">.</span><span style="color: #267F99">FakeEnumConverter</span><span style="color: #000000">))&#93;</span></span>
<span class="line"><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">partial</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #008000">    // typical &quot;Enum&quot; declarations, sort of like One = 1, Two = 2, Three</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">readonly</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> </span><span style="color: #001080">One</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">(</span><span style="color: #098658">1</span><span style="color: #000000">, </span><span style="color: #A31515">&quot;One&#39;s Friendly Name&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">readonly</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> </span><span style="color: #001080">Two</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">(</span><span style="color: #098658">2</span><span style="color: #000000">, </span><span style="color: #A31515">&quot;Two&#39;s Friendly Name&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">readonly</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> </span><span style="color: #001080">Three</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">(</span><span style="color: #098658">3</span><span style="color: #000000">, </span><span style="color: #A31515">&quot;Three&#39;s Friendly Name&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">readonly</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> </span><span style="color: #001080">Four</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">(</span><span style="color: #098658">4</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">readonly</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> </span><span style="color: #001080">Five</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">(</span><span style="color: #098658">5</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">readonly</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> </span><span style="color: #001080">Six</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">(</span><span style="color: #098658">6</span><span style="color: #000000">);</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #008000">    // implementation to provide &quot;Enum&quot; like functionality</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">friendlyName</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">FriendlyName</span><span style="color: #000000"> { </span><span style="color: #0000FF">get</span><span style="color: #000000"> { </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">friendlyName</span><span style="color: #000000">; } }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">override</span><span style="color: #000000"> </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #795E26">ToString</span><span style="color: #000000">() {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #795E26">ToString</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">virtual</span><span style="color: #000000"> </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #795E26">ToString</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">format</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">foreach</span><span style="color: #000000">(</span><span style="color: #267F99">FieldInfo</span><span style="color: #000000"> </span><span style="color: #001080">staticField</span><span style="color: #000000"> </span><span style="color: #AF00DB">in</span><span style="color: #000000"> </span><span style="color: #795E26">GetType</span><span style="color: #000000">().</span><span style="color: #795E26">GetFields</span><span style="color: #000000">(</span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Static</span><span style="color: #000000"> | </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Public</span><span style="color: #000000"> | </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">FlattenHierarchy</span><span style="color: #000000">)) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> </span><span style="color: #001080">temp</span><span style="color: #000000"> = </span><span style="color: #001080">staticField</span><span style="color: #000000">.</span><span style="color: #795E26">GetValue</span><span style="color: #000000">(</span><span style="color: #0000FF">null</span><span style="color: #000000">) </span><span style="color: #0000FF">as</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">temp</span><span style="color: #000000"> == </span><span style="color: #0000FF">null</span><span style="color: #000000">) </span><span style="color: #AF00DB">continue</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">temp</span><span style="color: #000000">.</span><span style="color: #001080">value</span><span style="color: #000000"> == </span><span style="color: #001080">value</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">switch</span><span style="color: #000000">(</span><span style="color: #001080">format</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">case</span><span style="color: #000000"> </span><span style="color: #A31515">&quot;fn&quot;</span><span style="color: #000000">: {</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">temp</span><span style="color: #000000">.</span><span style="color: #001080">friendlyName</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                    }</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">default</span><span style="color: #000000">: {</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">staticField</span><span style="color: #000000">.</span><span style="color: #001080">Name</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                    }</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #795E26">ToString</span><span style="color: #000000">();</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">override</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #795E26">GetHashCode</span><span style="color: #000000">() {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">.</span><span style="color: #795E26">GetHashCode</span><span style="color: #000000">();</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">override</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">Equals</span><span style="color: #000000">(</span><span style="color: #0000FF">object</span><span style="color: #000000"> </span><span style="color: #001080">obj</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #0000FF">object</span><span style="color: #000000">.</span><span style="color: #795E26">ReferenceEquals</span><span style="color: #000000">(</span><span style="color: #001080">obj</span><span style="color: #000000">, </span><span style="color: #0000FF">null</span><span style="color: #000000">)) </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> </span><span style="color: #001080">temp</span><span style="color: #000000"> = </span><span style="color: #001080">obj</span><span style="color: #000000"> </span><span style="color: #0000FF">as</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000">(!</span><span style="color: #0000FF">object</span><span style="color: #000000">.</span><span style="color: #795E26">ReferenceEquals</span><span style="color: #000000">(</span><span style="color: #001080">temp</span><span style="color: #000000">, </span><span style="color: #0000FF">null</span><span style="color: #000000">)) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">temp</span><span style="color: #000000">.</span><span style="color: #001080">value</span><span style="color: #000000"> == </span><span style="color: #001080">value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">object</span><span style="color: #000000"> </span><span style="color: #795E26">Parse</span><span style="color: #000000">(</span><span style="color: #267F99">Type</span><span style="color: #000000"> </span><span style="color: #001080">type</span><span style="color: #000000">, </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">foreach</span><span style="color: #000000">(</span><span style="color: #267F99">FieldInfo</span><span style="color: #000000"> </span><span style="color: #001080">fieldInfo</span><span style="color: #000000"> </span><span style="color: #AF00DB">in</span><span style="color: #000000"> </span><span style="color: #001080">type</span><span style="color: #000000">.</span><span style="color: #795E26">GetFields</span><span style="color: #000000">(</span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">FlattenHierarchy</span><span style="color: #000000"> | </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Static</span><span style="color: #000000"> | </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Public</span><span style="color: #000000">)) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> </span><span style="color: #001080">enumValue</span><span style="color: #000000"> = </span><span style="color: #001080">fieldInfo</span><span style="color: #000000">.</span><span style="color: #795E26">GetValue</span><span style="color: #000000">(</span><span style="color: #0000FF">null</span><span style="color: #000000">) </span><span style="color: #0000FF">as</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">enumValue</span><span style="color: #000000"> != </span><span style="color: #0000FF">null</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">enumValue</span><span style="color: #000000">.</span><span style="color: #001080">value</span><span style="color: #000000"> == </span><span style="color: #001080">value</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">enumValue</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">throw</span><span style="color: #000000"> </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">ArgumentException</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000">.</span><span style="color: #795E26">Format</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;{0} is not defined in {1}&quot;</span><span style="color: #000000">, </span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #001080">type</span><span style="color: #000000">.</span><span style="color: #001080">Name</span><span style="color: #000000">));</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">object</span><span style="color: #000000"> </span><span style="color: #795E26">Parse</span><span style="color: #000000">(</span><span style="color: #267F99">Type</span><span style="color: #000000"> </span><span style="color: #001080">type</span><span style="color: #000000">, </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #795E26">Parse</span><span style="color: #000000">(</span><span style="color: #001080">type</span><span style="color: #000000">, </span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #0000FF">false</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">object</span><span style="color: #000000"> </span><span style="color: #795E26">Parse</span><span style="color: #000000">(</span><span style="color: #267F99">Type</span><span style="color: #000000"> </span><span style="color: #001080">type</span><span style="color: #000000">, </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">ignoreCase</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000">.</span><span style="color: #795E26">IsNullOrEmpty</span><span style="color: #000000">(</span><span style="color: #001080">value</span><span style="color: #000000">)) </span><span style="color: #AF00DB">throw</span><span style="color: #000000"> </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">ArgumentNullException</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;value was either null or empty&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">foreach</span><span style="color: #000000">(</span><span style="color: #267F99">FieldInfo</span><span style="color: #000000"> </span><span style="color: #001080">field</span><span style="color: #000000"> </span><span style="color: #AF00DB">in</span><span style="color: #000000"> </span><span style="color: #001080">type</span><span style="color: #000000">.</span><span style="color: #795E26">GetFields</span><span style="color: #000000">(</span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Public</span><span style="color: #000000"> | </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Static</span><span style="color: #000000"> | </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">FlattenHierarchy</span><span style="color: #000000">)) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">isMatch</span><span style="color: #000000"> = </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">ignoreCase</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">isMatch</span><span style="color: #000000"> = </span><span style="color: #001080">StringComparer</span><span style="color: #000000">.</span><span style="color: #001080">InvariantCultureIgnoreCase</span><span style="color: #000000">.</span><span style="color: #795E26">Compare</span><span style="color: #000000">(</span><span style="color: #001080">field</span><span style="color: #000000">.</span><span style="color: #001080">Name</span><span style="color: #000000">, </span><span style="color: #001080">value</span><span style="color: #000000">) == </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">isMatch</span><span style="color: #000000"> = </span><span style="color: #001080">StringComparer</span><span style="color: #000000">.</span><span style="color: #001080">InvariantCulture</span><span style="color: #000000">.</span><span style="color: #795E26">Compare</span><span style="color: #000000">(</span><span style="color: #001080">field</span><span style="color: #000000">.</span><span style="color: #001080">Name</span><span style="color: #000000">, </span><span style="color: #001080">value</span><span style="color: #000000">) == </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">isMatch</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> </span><span style="color: #001080">temp</span><span style="color: #000000"> = </span><span style="color: #001080">field</span><span style="color: #000000">.</span><span style="color: #795E26">GetValue</span><span style="color: #000000">(</span><span style="color: #0000FF">null</span><span style="color: #000000">) </span><span style="color: #0000FF">as</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">temp</span><span style="color: #000000"> == </span><span style="color: #0000FF">null</span><span style="color: #000000">) </span><span style="color: #AF00DB">throw</span><span style="color: #000000"> </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">InvalidOperationException</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000">.</span><span style="color: #795E26">Format</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;{0} not convertable to {1}&quot;</span><span style="color: #000000">, </span><span style="color: #001080">type</span><span style="color: #000000">, </span><span style="color: #0000FF">typeof</span><span style="color: #000000">(</span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">)));</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">object</span><span style="color: #000000"> </span><span style="color: #001080">instance</span><span style="color: #000000"> = </span><span style="color: #001080">Activator</span><span style="color: #000000">.</span><span style="color: #795E26">CreateInstance</span><span style="color: #000000">(</span><span style="color: #001080">type</span><span style="color: #000000">, </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #0000FF">object</span><span style="color: #000000">[] { </span><span style="color: #001080">temp</span><span style="color: #000000">.</span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #001080">temp</span><span style="color: #000000">.</span><span style="color: #001080">friendlyName</span><span style="color: #000000"> });</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">instance</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">throw</span><span style="color: #000000"> </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">ArgumentException</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000">.</span><span style="color: #795E26">Format</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;{0} is not defined in {1}&quot;</span><span style="color: #000000">, </span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #001080">type</span><span style="color: #000000">.</span><span style="color: #001080">Name</span><span style="color: #000000">));</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">IsDefined</span><span style="color: #000000">(</span><span style="color: #267F99">Type</span><span style="color: #000000"> </span><span style="color: #001080">type</span><span style="color: #000000">, </span><span style="color: #0000FF">object</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #0000FF">object</span><span style="color: #000000">.</span><span style="color: #795E26">ReferenceEquals</span><span style="color: #000000">(</span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #0000FF">null</span><span style="color: #000000">)) </span><span style="color: #AF00DB">throw</span><span style="color: #000000"> </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">ArgumentNullException</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;value&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #0000FF">typeof</span><span style="color: #000000">(</span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">).</span><span style="color: #795E26">IsAssignableFrom</span><span style="color: #000000">(</span><span style="color: #001080">type</span><span style="color: #000000">)) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #795E26">IsDefined</span><span style="color: #000000">(</span><span style="color: #001080">type</span><span style="color: #000000">, ((</span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">)</span><span style="color: #001080">value</span><span style="color: #000000">).</span><span style="color: #001080">value</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">IsDefined</span><span style="color: #000000">(</span><span style="color: #267F99">Type</span><span style="color: #000000"> </span><span style="color: #001080">type</span><span style="color: #000000">, </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">foreach</span><span style="color: #000000">(</span><span style="color: #267F99">FieldInfo</span><span style="color: #000000"> </span><span style="color: #001080">staticField</span><span style="color: #000000"> </span><span style="color: #AF00DB">in</span><span style="color: #000000"> </span><span style="color: #001080">type</span><span style="color: #000000">.</span><span style="color: #795E26">GetFields</span><span style="color: #000000">(</span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Static</span><span style="color: #000000"> | </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Public</span><span style="color: #000000"> | </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">FlattenHierarchy</span><span style="color: #000000">)) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">object</span><span style="color: #000000"> </span><span style="color: #001080">temp</span><span style="color: #000000"> = </span><span style="color: #001080">staticField</span><span style="color: #000000">.</span><span style="color: #795E26">GetValue</span><span style="color: #000000">(</span><span style="color: #0000FF">null</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">temp</span><span style="color: #000000"> == </span><span style="color: #0000FF">null</span><span style="color: #000000">) </span><span style="color: #AF00DB">continue</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #0000FF">typeof</span><span style="color: #000000">(</span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">).</span><span style="color: #795E26">IsAssignableFrom</span><span style="color: #000000">(</span><span style="color: #001080">type</span><span style="color: #000000">)) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000">(((</span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">)</span><span style="color: #001080">temp</span><span style="color: #000000">).</span><span style="color: #001080">value</span><span style="color: #000000"> == </span><span style="color: #001080">value</span><span style="color: #000000">) </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">true</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">IsDefined</span><span style="color: #000000">(</span><span style="color: #267F99">Type</span><span style="color: #000000"> </span><span style="color: #001080">type</span><span style="color: #000000">, </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #795E26">IsDefined</span><span style="color: #000000">(</span><span style="color: #001080">type</span><span style="color: #000000">, </span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #0000FF">false</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">IsDefined</span><span style="color: #000000">(</span><span style="color: #267F99">Type</span><span style="color: #000000"> </span><span style="color: #001080">type</span><span style="color: #000000">, </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">ignoreCase</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">foreach</span><span style="color: #000000">(</span><span style="color: #267F99">FieldInfo</span><span style="color: #000000"> </span><span style="color: #001080">staticField</span><span style="color: #000000"> </span><span style="color: #AF00DB">in</span><span style="color: #000000"> </span><span style="color: #001080">type</span><span style="color: #000000">.</span><span style="color: #795E26">GetFields</span><span style="color: #000000">(</span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Static</span><span style="color: #000000"> | </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Public</span><span style="color: #000000"> | </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">FlattenHierarchy</span><span style="color: #000000">)) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">isMatch</span><span style="color: #000000"> = </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">ignoreCase</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">isMatch</span><span style="color: #000000"> = </span><span style="color: #001080">StringComparer</span><span style="color: #000000">.</span><span style="color: #001080">InvariantCultureIgnoreCase</span><span style="color: #000000">.</span><span style="color: #795E26">Compare</span><span style="color: #000000">(</span><span style="color: #001080">staticField</span><span style="color: #000000">.</span><span style="color: #001080">Name</span><span style="color: #000000">, </span><span style="color: #001080">value</span><span style="color: #000000">) == </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">isMatch</span><span style="color: #000000"> = </span><span style="color: #001080">StringComparer</span><span style="color: #000000">.</span><span style="color: #001080">InvariantCulture</span><span style="color: #000000">.</span><span style="color: #795E26">Compare</span><span style="color: #000000">(</span><span style="color: #001080">staticField</span><span style="color: #000000">.</span><span style="color: #001080">Name</span><span style="color: #000000">, </span><span style="color: #001080">value</span><span style="color: #000000">) == </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">isMatch</span><span style="color: #000000">) </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">true</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">explicit</span><span style="color: #000000"> </span><span style="color: #0000FF">operator</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">(</span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">foreach</span><span style="color: #000000">(</span><span style="color: #267F99">FieldInfo</span><span style="color: #000000"> </span><span style="color: #001080">staticField</span><span style="color: #000000"> </span><span style="color: #AF00DB">in</span><span style="color: #000000"> </span><span style="color: #0000FF">typeof</span><span style="color: #000000">(</span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">).</span><span style="color: #795E26">GetFields</span><span style="color: #000000">(</span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Public</span><span style="color: #000000"> | </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Static</span><span style="color: #000000"> | </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">FlattenHierarchy</span><span style="color: #000000">)) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> </span><span style="color: #001080">temp</span><span style="color: #000000"> = </span><span style="color: #001080">staticField</span><span style="color: #000000">.</span><span style="color: #795E26">GetValue</span><span style="color: #000000">(</span><span style="color: #0000FF">null</span><span style="color: #000000">) </span><span style="color: #0000FF">as</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #0000FF">null</span><span style="color: #000000"> == </span><span style="color: #001080">temp</span><span style="color: #000000">) </span><span style="color: #AF00DB">continue</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">temp</span><span style="color: #000000">.</span><span style="color: #001080">value</span><span style="color: #000000"> == </span><span style="color: #001080">value</span><span style="color: #000000">) </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">temp</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">null</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">explicit</span><span style="color: #000000"> </span><span style="color: #0000FF">operator</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000">(</span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> </span><span style="color: #001080">fakeEnum</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">fakeEnum</span><span style="color: #000000">.</span><span style="color: #001080">value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">implicit</span><span style="color: #000000"> </span><span style="color: #0000FF">operator</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000">.</span><span style="color: #795E26">IsNullOrEmpty</span><span style="color: #000000">(</span><span style="color: #001080">value</span><span style="color: #000000">)) </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">null</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">foreach</span><span style="color: #000000">(</span><span style="color: #267F99">FieldInfo</span><span style="color: #000000"> </span><span style="color: #001080">field</span><span style="color: #000000"> </span><span style="color: #AF00DB">in</span><span style="color: #000000"> </span><span style="color: #0000FF">typeof</span><span style="color: #000000">(</span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">).</span><span style="color: #795E26">GetFields</span><span style="color: #000000">(</span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Public</span><span style="color: #000000"> | </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Static</span><span style="color: #000000"> | </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">FlattenHierarchy</span><span style="color: #000000">)) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">StringComparer</span><span style="color: #000000">.</span><span style="color: #001080">InvariantCultureIgnoreCase</span><span style="color: #000000">.</span><span style="color: #795E26">Compare</span><span style="color: #000000">(</span><span style="color: #001080">field</span><span style="color: #000000">.</span><span style="color: #001080">Name</span><span style="color: #000000">, </span><span style="color: #001080">value</span><span style="color: #000000">) == </span><span style="color: #098658">0</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> </span><span style="color: #001080">temp</span><span style="color: #000000"> = </span><span style="color: #001080">field</span><span style="color: #000000">.</span><span style="color: #795E26">GetValue</span><span style="color: #000000">(</span><span style="color: #0000FF">null</span><span style="color: #000000">) </span><span style="color: #0000FF">as</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000">( </span><span style="color: #0000FF">null</span><span style="color: #000000"> == </span><span style="color: #001080">temp</span><span style="color: #000000">) </span><span style="color: #AF00DB">throw</span><span style="color: #000000"> </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">InvalidOperationException</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000">.</span><span style="color: #795E26">Format</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;{0} not convertable to {1}&quot;</span><span style="color: #000000">, </span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #0000FF">typeof</span><span style="color: #000000">(</span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">)));</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> </span><span style="color: #001080">instance</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">(</span><span style="color: #001080">temp</span><span style="color: #000000">.</span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #001080">temp</span><span style="color: #000000">.</span><span style="color: #001080">friendlyName</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">instance</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">null</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #0000FF">operator</span><span style="color: #000000"> </span><span style="color: #795E26">==</span><span style="color: #000000"> (</span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> </span><span style="color: #001080">a</span><span style="color: #000000">, </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> </span><span style="color: #001080">b</span><span style="color: #000000">) { </span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #0000FF">object</span><span style="color: #000000">.</span><span style="color: #795E26">ReferenceEquals</span><span style="color: #000000">(</span><span style="color: #001080">a</span><span style="color: #000000">, </span><span style="color: #0000FF">null</span><span style="color: #000000">)) </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">false</span><span style="color: #000000">;      </span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">a</span><span style="color: #000000">.</span><span style="color: #795E26">Equals</span><span style="color: #000000">(</span><span style="color: #001080">b</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #0000FF">operator</span><span style="color: #000000"> </span><span style="color: #795E26">!=</span><span style="color: #000000"> (</span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> </span><span style="color: #001080">a</span><span style="color: #000000">, </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> </span><span style="color: #001080">b</span><span style="color: #000000">) { </span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #0000FF">object</span><span style="color: #000000">.</span><span style="color: #795E26">ReferenceEquals</span><span style="color: #000000">(</span><span style="color: #001080">a</span><span style="color: #000000">, </span><span style="color: #0000FF">null</span><span style="color: #000000">)) </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">true</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> !</span><span style="color: #001080">a</span><span style="color: #000000">.</span><span style="color: #795E26">Equals</span><span style="color: #000000">(</span><span style="color: #001080">b</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">protected</span><span style="color: #000000"> </span><span style="color: #795E26">FakeEnum</span><span style="color: #000000">(</span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">) : </span><span style="color: #0000FF">this</span><span style="color: #000000">(</span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #0000FF">null</span><span style="color: #000000">) { }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">protected</span><span style="color: #000000"> </span><span style="color: #795E26">FakeEnum</span><span style="color: #000000">(</span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">, </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">friendlyName</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">this</span><span style="color: #000000">.</span><span style="color: #001080">value</span><span style="color: #000000"> = </span><span style="color: #001080">value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">this</span><span style="color: #000000">.</span><span style="color: #001080">friendlyName</span><span style="color: #000000"> = </span><span style="color: #001080">friendlyName</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000">.</span><span style="color: #795E26">IsNullOrEmpty</span><span style="color: #000000">(</span><span style="color: #001080">friendlyName</span><span style="color: #000000">)) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">this</span><span style="color: #000000">.</span><span style="color: #001080">friendlyName</span><span style="color: #000000"> = </span><span style="color: #795E26">ToString</span><span style="color: #000000">();</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnumConverter</span><span style="color: #000000"> : </span><span style="color: #267F99">TypeConverter</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">override</span><span style="color: #000000"> </span><span style="color: #0000FF">object</span><span style="color: #000000"> </span><span style="color: #795E26">ConvertFrom</span><span style="color: #000000">(</span><span style="color: #267F99">ITypeDescriptorContext</span><span style="color: #000000"> </span><span style="color: #001080">context</span><span style="color: #000000">, </span><span style="color: #267F99">CultureInfo</span><span style="color: #000000"> </span><span style="color: #001080">culture</span><span style="color: #000000">, </span><span style="color: #0000FF">object</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">value</span><span style="color: #000000"> </span><span style="color: #0000FF">is</span><span style="color: #000000"> </span><span style="color: #0000FF">string</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">return</span><span style="color: #000000"> (</span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">)((</span><span style="color: #0000FF">string</span><span style="color: #000000">)</span><span style="color: #001080">value</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #795E26">ConvertFrom</span><span style="color: #000000">(</span><span style="color: #001080">context</span><span style="color: #000000">, </span><span style="color: #001080">culture</span><span style="color: #000000">, </span><span style="color: #001080">value</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>Since we were generating these guys, we&#8217;d put the class implementation in one file, and our enum like declarations in another. It made it look a bit more &#8220;enum&#8221; like.<br><br>From there, you can use it just like a normal enum except that you now have a built in friendly name that you can access:<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public void MyMethod(FakeEnum flag) {
    switch(flag) {
        case FakeEnum.One: {
            Console.WriteLine(flag.FriendlyName);
        }
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">MyMethod</span><span style="color: #000000">(</span><span style="color: #267F99">FakeEnum</span><span style="color: #000000"> </span><span style="color: #001080">flag</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">switch</span><span style="color: #000000">(</span><span style="color: #001080">flag</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">case</span><span style="color: #000000"> </span><span style="color: #267F99">FakeEnum</span><span style="color: #000000">.</span><span style="color: #267F99">One</span><span style="color: #000000">: {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">Console</span><span style="color: #000000">.</span><span style="color: #795E26">WriteLine</span><span style="color: #000000">(</span><span style="color: #001080">flag</span><span style="color: #000000">.</span><span style="color: #001080">FriendlyName</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>Since additional partial classes would be added, I didn&#8217;t want to have to provide some functionality of <code>ToString</code> or explicit conversion for each partial class, so I resolved the ability to get the numeric value, string member name value through reflection. Since I had full control over the type, I decided it would be nice to add the <code>FriendlyNameAttribute</code> functionality into my fake enum, so I did.<br><br>Its implementation uses .net reflection to iterate over its members and obtain the enum like member and its associated and values (since every member we use like an enum will be a static instance of itself) and additionally its friendly name. actually we could make our fake enum non-numeric based (this would kind of defeat the ability to do a flag like operation) but that wasn&#8217;t something needed at the time so we just stuck with int.<br><br>To be able to use these objects like a bit field (like enums are), one would need to add the | and &amp; operators so that fields could be combined or extracted (perhaps if I&#8217;m bored I&#8217;ll add this to a future version).</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>C# 3.0 Lambda expressions</title>
		<link>http://www.sanity-free.com/csharp_3_0_lambda_expressions.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Mon, 12 Feb 2007 18:00:40 +0000</pubDate>
				<category><![CDATA[C# Articles]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=227</guid>

					<description><![CDATA[I&#8217;ve finally seen the light for these little buggers. As I wrote in my original post that I really didn&#8217;t glean much from the description of lambda expressions that are mentioned in the specification, but I ran across a great article on it on the code project that did a really good job at explaining [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>I&#8217;ve finally seen the light for these little buggers. As I wrote in my <a href="/the_csharp_3_0_language_specification.html" target="_blank" rel="noreferrer noopener">original post</a> that I really didn&#8217;t glean much from the description of lambda expressions that are mentioned in the specification, but I ran across a great article on it on the code project that did a really good job at explaining it.<br><br>So my meta blog for the day is a link to that article:<br><br>» <a href="https://www.codeproject.com/articles/Lambda-Expressions-and-Expression-Trees-An-Introdu#comments-section" target="_blank" rel="noreferrer noopener">http://www.codeproject.com/csharp/lambdaexpressions.asp</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Phalanger, PHP for .NET</title>
		<link>http://www.sanity-free.com/phalanger_php_for_dotnet.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Thu, 25 Jan 2007 18:00:15 +0000</pubDate>
				<category><![CDATA[PHP Articles]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=224</guid>

					<description><![CDATA[I ran across an article on the code project about a PHP compiler / language extension for .NET. PHP has an extension for .NET that allows you to use .NET resources in PHP code, but this allows you to use PHP from .NET, with support for native PHP API&#8217;s as well as managed compilation. This [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>I ran across an article on the code project about a PHP compiler / language extension for .NET.<br><br>PHP has an extension for .NET that allows you to use .NET resources in PHP code, but this allows you to use PHP from .NET, with support for native PHP API&#8217;s as well as managed compilation. This project may end up making my article on <a href="/php_webservices_and_csharp_dotnet_soap_clients.html" target="_blank" rel="noreferrer noopener">nusoap &amp; C#</a> obsolete, though it should make writing web services in PHP as easy as it is in C#.<br><br>»&nbsp;<a href="https://github.com/peachpiecompiler/peachpie" target="_blank" rel="noreferrer noopener">Phalanger Home</a> (now peachpie, link updated to new project)<br>»&nbsp;<s>Code Project Article</s> (long since abandoned)<br></p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="350" height="450" src="http://sanity-free.org/wp-content/uploads/2025/10/vsnetscreen.gif" alt="" class="wp-image-90"/></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>.NET Reflection</title>
		<link>http://www.sanity-free.com/dotnet_reflection.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Fri, 05 Jan 2007 18:00:08 +0000</pubDate>
				<category><![CDATA[C# Articles]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[reflection]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=222</guid>

					<description><![CDATA[What is reflection? Its the image we seen in a mirror. In .NET however its a system that lets you do at runtime what you would normally do in a text editor or visual studio. Like most object oriented programming languages, .net has the concept of a &#8220;type.&#8221; a Type defines what an object is. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>What is reflection? Its the image we seen in a mirror. In .NET however its a system that lets you do at runtime what you would normally do in a text editor or visual studio.<br><br>Like most object oriented programming languages, .net has the concept of a &#8220;type.&#8221; a Type defines what an object is. Whether your using a primitive such as an integer, or a complex data type, each thing in .net has a type that corresponds to what it is.<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public class Foo {}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Foo</span><span style="color: #000000"> {}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>This class is of type Foo. Now this class is basically pointless&#8230; Why? Well because it has no members. Actually it does have members because everything inherits from System.Object, and System.Object has 12 member methods some have overloads, some are static, some are private some are protected others are public. For the sake of simplicity, we wont discuss System.Object, but will stick only to Foo.<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public class Foo {
    private int a;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Foo</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">a</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>Typically we&#8217;d never have a class that looked like this. After all, the compiler would never let us access Foo::a because it is a private member. What does this have to do with reflection you may ask yourself? The rules of the compiler do not apply to reflection.<br><br>To understand reflection, you need to understand what a class is, how encapsulation works (what access modifiers are), what a function is and what variables are. We could go a little further, but that&#8217;s a good starting point.<br><br>Lets take our previous class declaration and spice it up a bit.<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public class Foo {
    private int a;

    public int A { 
        get { return a; }
        set { a = value; }
    }

    public bool Bar(string input) {
        return input == "Baz";
    }

    protected void Bing() {
        Console.WriteLine("I'm not very creative");
    }    

    public Foo() { }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Foo</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">a</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">A</span><span style="color: #000000"> { </span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">get</span><span style="color: #000000"> { </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">a</span><span style="color: #000000">; }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">set</span><span style="color: #000000"> { </span><span style="color: #001080">a</span><span style="color: #000000"> = </span><span style="color: #001080">value</span><span style="color: #000000">; }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">Bar</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">input</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">input</span><span style="color: #000000"> == </span><span style="color: #A31515">&quot;Baz&quot;</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">protected</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">Bing</span><span style="color: #000000">() {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #001080">Console</span><span style="color: #000000">.</span><span style="color: #795E26">WriteLine</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;I&#39;m not very creative&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    }    </span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #795E26">Foo</span><span style="color: #000000">() { }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>I&#8217;ve given Foo a makeover. It now has a private variable, a public property, a public and a protected method and a constructor. I&#8217;ve given Foo a few &#8220;members.&#8221;<br><br>On the surface (which I wont scratch much) reflection allows you to access, modify or invoke members of an object.<br><br>In our editor we can do this very easily:<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Foo f = new Foo();
bool b = f.Bar("Baz");</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #267F99">Foo</span><span style="color: #000000"> </span><span style="color: #001080">f</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">Foo</span><span style="color: #000000">();</span></span>
<span class="line"><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">b</span><span style="color: #000000"> = </span><span style="color: #001080">f</span><span style="color: #000000">.</span><span style="color: #795E26">Bar</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;Baz&quot;</span><span style="color: #000000">);</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>So lets look at what we&#8217;re doing here.<br><br>Where does Foo come from?<br><br>At the top (or bottom, depending on your endianness) of the Reflection world is the Assembly (a dll or exe). .NET assemblies are files that (can) contain namespaces and classes. Each assembly contains a manifest (aka a list) of other assemblies that it references. It also contains info about what classes it contains.<br><br>When a .NET application starts up, the framework spiders out and loads each assembly in each referenced assembly&#8217;s manifest until everything referenced is loaded into the current <a href="http://msdn2.microsoft.com/en-us/library/system.appdomain.aspx" target="_blank" rel="noreferrer noopener">AppDomain</a>. If <code>Foo</code> happens to be in one of these dll&#8217;s then everything is fine, but what if it isn&#8217;t? Lets start there. The <code>AppDomain</code> object contains a list of all loaded &#8220;Assemblies&#8221; (if you cared to look at whats loaded).<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies();</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #267F99">Assembly</span><span style="color: #000000">[] </span><span style="color: #001080">asms</span><span style="color: #000000"> = </span><span style="color: #001080">AppDomain</span><span style="color: #000000">.</span><span style="color: #001080">CurrentDomain</span><span style="color: #000000">.</span><span style="color: #795E26">GetAssemblies</span><span style="color: #000000">();</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>if an assembly is not loaded, we can load it ourselves (unlike other technologies, once an assembly is loaded into the app domain, it cannot be unloaded until the app domain is unloaded).<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Assembly fooAsm = Assembly.LoadFile(@"C:\My Path\foo.dll");</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #267F99">Assembly</span><span style="color: #000000"> </span><span style="color: #001080">fooAsm</span><span style="color: #000000"> = </span><span style="color: #001080">Assembly</span><span style="color: #000000">.</span><span style="color: #795E26">LoadFile</span><span style="color: #000000">(</span><span style="color: #A31515">@&quot;C:\My Path\foo.dll&quot;</span><span style="color: #000000">);</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>The Assembly object represents the actual dll or exe file and all that is contained within it. From it, we can get a list of types that the assembly contains:<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Type[] types = fooAsm.GetTypes();</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #267F99">Type</span><span style="color: #000000">[] </span><span style="color: #001080">types</span><span style="color: #000000"> = </span><span style="color: #001080">fooAsm</span><span style="color: #000000">.</span><span style="color: #795E26">GetTypes</span><span style="color: #000000">();</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>or request a particular type:<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Type fooType = fooAsm.GetType("Foo");</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #267F99">Type</span><span style="color: #000000"> </span><span style="color: #001080">fooType</span><span style="color: #000000"> = </span><span style="color: #001080">fooAsm</span><span style="color: #000000">.</span><span style="color: #795E26">GetType</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;Foo&quot;</span><span style="color: #000000">);</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>if fooAsm did not contain a class named &#8220;<code>Foo</code>&#8221; then <code>GetType</code> would return null.<br><br>So, now we&#8217;ve loaded the dll / assembly that contained our class, and we&#8217;ve gotten a Type object that contains information about the class <code>Foo</code>. From fooType, we can get a list of <code>Foo</code>&#8216;s members:<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>MemberInfo[] memberInfo = fooType.GetMembers();</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #267F99">MemberInfo</span><span style="color: #000000">[] </span><span style="color: #001080">memberInfo</span><span style="color: #000000"> = </span><span style="color: #001080">fooType</span><span style="color: #000000">.</span><span style="color: #795E26">GetMembers</span><span style="color: #000000">();</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p><code>MemberInfo</code> is the base class for other member specific things like fields, methods, properties and constructors. <code>MemberInfo</code> has a property named <code>Name</code> which will match the name you give the member at the source code level (variable a, property A, method Bar, and constructor Foo). The <code>System.Type</code> object can also be used to get specific types of members like fields, methods, constructors and properties.<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>MethodInfo[] methods = fooType.GetMethods();
PropertyInfo[] properties = fooType.GetProperties();
FieldInfo[] fields = fooType.GetFields();
ConstructorInfo[] constructors = fooType.GetConstructors();</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #267F99">MethodInfo</span><span style="color: #000000">[] </span><span style="color: #001080">methods</span><span style="color: #000000"> = </span><span style="color: #001080">fooType</span><span style="color: #000000">.</span><span style="color: #795E26">GetMethods</span><span style="color: #000000">();</span></span>
<span class="line"><span style="color: #267F99">PropertyInfo</span><span style="color: #000000">[] </span><span style="color: #001080">properties</span><span style="color: #000000"> = </span><span style="color: #001080">fooType</span><span style="color: #000000">.</span><span style="color: #795E26">GetProperties</span><span style="color: #000000">();</span></span>
<span class="line"><span style="color: #267F99">FieldInfo</span><span style="color: #000000">[] </span><span style="color: #001080">fields</span><span style="color: #000000"> = </span><span style="color: #001080">fooType</span><span style="color: #000000">.</span><span style="color: #795E26">GetFields</span><span style="color: #000000">();</span></span>
<span class="line"><span style="color: #267F99">ConstructorInfo</span><span style="color: #000000">[] </span><span style="color: #001080">constructors</span><span style="color: #000000"> = </span><span style="color: #001080">fooType</span><span style="color: #000000">.</span><span style="color: #795E26">GetConstructors</span><span style="color: #000000">();</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>These objects contains more member specific info, such as method parameters, and return type, whether the property has a get and set or just a getter. Each of these Get&#8230;() methods also has an overload that takes a <a href="http://msdn2.microsoft.com/en-us/library/system.reflection.bindingflags.aspx" target="_blank" rel="noreferrer noopener">BindingFlags</a> parameter. <code>BindingFlags</code> are things that must be considered when looking for a member. if we use the <code>GetMember(field,property,method or constructor)</code> that takes a string, it will look for a member who&#8217;s name matches that. Reflection uses more than just the name to find the member that you&#8217;re requesting, the binding flags give additional info as to the members access modifier (public / non-public), whether it&#8217;s an instance member or a static member, and so on.<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>FieldInfo aField = fooType.GetField("a", BindingFlags.NonPublic | BindingFlags.Instance);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #267F99">FieldInfo</span><span style="color: #000000"> </span><span style="color: #001080">aField</span><span style="color: #000000"> = </span><span style="color: #001080">fooType</span><span style="color: #000000">.</span><span style="color: #795E26">GetField</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;a&quot;</span><span style="color: #000000">, </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">NonPublic</span><span style="color: #000000"> | </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Instance</span><span style="color: #000000">);</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>In the above code, I get a <code>FieldInfo</code> object which represents the private int variable &#8220;a&#8221; and I can do the same with the method Bar, the parameterless constructor and the property.<br><br>Great right? Who the heck cares? What does this have to do with the price of tea? Lets see&#8230;<br><br>When we simply wrote the code:<br></p>



<pre class="wp-block-preformatted">Foo f = new Foo();</pre>



<p>the compiler had to locate the assembly that contains foo, load the foo type and create an instance. so lets do the same, but using reflection.<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Assembly fooAsm = Assembly.LoadFile(@"C:\My Path\foo.dll");
Type fooType = fooAsm.GetType("Foo");
object foo = Activator.CreateInstance(fooType);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #267F99">Assembly</span><span style="color: #000000"> </span><span style="color: #001080">fooAsm</span><span style="color: #000000"> = </span><span style="color: #001080">Assembly</span><span style="color: #000000">.</span><span style="color: #795E26">LoadFile</span><span style="color: #000000">(</span><span style="color: #A31515">@&quot;C:\My Path\foo.dll&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #267F99">Type</span><span style="color: #000000"> </span><span style="color: #001080">fooType</span><span style="color: #000000"> = </span><span style="color: #001080">fooAsm</span><span style="color: #000000">.</span><span style="color: #795E26">GetType</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;Foo&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #0000FF">object</span><span style="color: #000000"> </span><span style="color: #001080">foo</span><span style="color: #000000"> = </span><span style="color: #001080">Activator</span><span style="color: #000000">.</span><span style="color: #795E26">CreateInstance</span><span style="color: #000000">(</span><span style="color: #001080">fooType</span><span style="color: #000000">);</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>Keep in mind that when we load the assembly at runtime, we cannot simply do:<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Foo f = (Foo)Activator.CreateInstance(fooType);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #267F99">Foo</span><span style="color: #000000"> </span><span style="color: #001080">f</span><span style="color: #000000"> = (</span><span style="color: #267F99">Foo</span><span style="color: #000000">)</span><span style="color: #001080">Activator</span><span style="color: #000000">.</span><span style="color: #795E26">CreateInstance</span><span style="color: #000000">(</span><span style="color: #001080">fooType</span><span style="color: #000000">);</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>unless we add a reference to foo.dll inside visual studio or in our command line compile statement. If we did that, then we don&#8217;t need to use reflection. We simply need an instance of foo. At the time we code it, we don&#8217;t care what its type actually is. We know we have an instance of it, and can invoke its methods, access its properties and set its members through reflection (using the <code>MemberInfo</code>, <code>MethodInfo</code>, <code>PropertyInfo</code>, <code>FieldInfo</code>&#8216;s that we get from its Type object). With reflection, the boundaries of encapsulation no longer apply (but should still be respected). We can access internal objects, we can access and manipulate private class members, or invoke private methods. Back to the matter of creating the instance of foo&#8230; One thing to keep in mind about using <code>Activator.CreateInstance</code> is that it actually uses the objects constructor to create the instance that gets returned, so if you <code>CreateInstance</code> as I have above, make sure you have a parameter-less constructor in your class. Otherwise, you&#8217;ll also have to pass in the constructor args as the second set of parameters after the System.Type in <code>CreateInstance</code>.<br><br>now lets imagine something crazy that we want to do:<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Foo foo = new Foo();
foo.a = 32;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #267F99">Foo</span><span style="color: #000000"> </span><span style="color: #001080">foo</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">Foo</span><span style="color: #000000">();</span></span>
<span class="line"><span style="color: #001080">foo</span><span style="color: #000000">.</span><span style="color: #001080">a</span><span style="color: #000000"> = </span><span style="color: #098658">32</span><span style="color: #000000">;</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>we could never write code that would do this unless it was inside a member (method or property) of <code>Foo</code> (a is a private member and therefore isn&#8217;t accessible externally to <code>Foo</code>).<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Assembly fooAsm = Assembly.LoadFile(@"C:\My Path\foo.dll");
Type fooType = fooAsm.GetType("Foo");
object foo = Activator.CreateInstance(fooType);
FieldInfo fooFieldA = fooType.GetField("a", BindingFlags.NonPublic | BindingFlags.Instance);
fooFieldA.SetValue(foo, 32);
int aVal = (int)fooFieldA.GetValue(foo);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #267F99">Assembly</span><span style="color: #000000"> </span><span style="color: #001080">fooAsm</span><span style="color: #000000"> = </span><span style="color: #001080">Assembly</span><span style="color: #000000">.</span><span style="color: #795E26">LoadFile</span><span style="color: #000000">(</span><span style="color: #A31515">@&quot;C:\My Path\foo.dll&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #267F99">Type</span><span style="color: #000000"> </span><span style="color: #001080">fooType</span><span style="color: #000000"> = </span><span style="color: #001080">fooAsm</span><span style="color: #000000">.</span><span style="color: #795E26">GetType</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;Foo&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #0000FF">object</span><span style="color: #000000"> </span><span style="color: #001080">foo</span><span style="color: #000000"> = </span><span style="color: #001080">Activator</span><span style="color: #000000">.</span><span style="color: #795E26">CreateInstance</span><span style="color: #000000">(</span><span style="color: #001080">fooType</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #267F99">FieldInfo</span><span style="color: #000000"> </span><span style="color: #001080">fooFieldA</span><span style="color: #000000"> = </span><span style="color: #001080">fooType</span><span style="color: #000000">.</span><span style="color: #795E26">GetField</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;a&quot;</span><span style="color: #000000">, </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">NonPublic</span><span style="color: #000000"> | </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Instance</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #001080">fooFieldA</span><span style="color: #000000">.</span><span style="color: #795E26">SetValue</span><span style="color: #000000">(</span><span style="color: #001080">foo</span><span style="color: #000000">, </span><span style="color: #098658">32</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">aVal</span><span style="color: #000000"> = (</span><span style="color: #0000FF">int</span><span style="color: #000000">)</span><span style="color: #001080">fooFieldA</span><span style="color: #000000">.</span><span style="color: #795E26">GetValue</span><span style="color: #000000">(</span><span style="color: #001080">foo</span><span style="color: #000000">);</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>so in the above code, we loaded the foo.dll, got the type that we were looking for (<code>Foo</code>), created an instance of it (using <code>Activator.CreateInstance</code>), got the field that we wanted to set, and used the <code>FieldInfo</code> object to set that field in our instance. then for good measures, we got the value that we just set using that field info object.<br><br>Each of the derived objects of <code>MemberInfo</code> (<code>MethodInfo</code>, <code>FieldInfo</code>, <code>PropertyInfo</code>, <code>ConstructorInfo</code>, <code>EventInfo</code>) all use the same concepts. First, you obtain an instance of the object you wish to reflect upon, then you obtain the <code>XXXXInfo</code> object that represents the member you want to manipulate, then you use that object to <code>get</code>, <code>set</code>, <code>invoke</code> or <code>handle</code> whatever your trying to do. That necessitates having a valid instance (which you have) and that&#8217;s pretty much the basics of using reflection.<br><br>This has been an end to end application of the use of reflection. It is not meant as a style guide in how you use reflection. You may very well know everything about the type you&#8217;re reflecting upon. In that instance, you may just want to reflectively invoke a method, or set a property. You may actually want to modify the look and feel or a Windows control which provides no public means of achieving what you wish to achieve.<br><br>Here&#8217;s a little parting sample using the reflection to access an modify various parts of Foo.</p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Assembly fooAsm = Assembly.LoadFile(@"C:\My Path\foo.dll");
Type fooType = fooAsm.GetType("Foo");
object foo = Activator.CreateInstance(fooType);
MethodInfo barMethod = fooType.GetMethod("Bar", BindingFlags.Public | BindingFlags.Instance);
// invoke ( instance, method parameters );
bool isBar = barMethod.Invoke(foo, new object[] { "Baz" });

MethodInfo bingMethod = fooType.GetMethod("Bing", BindingFlags.NonPublic | BindingFlags.Instance);
bingMethod.Invoke(foo, null);

PropertyInfo propertyA = fooType.GetProperty("A", BindingFlags.Public | BindingFlags.Instance);
propertyA.SetValue(foo, 33);
int aVal = propertyA.GetValue(foo, null); // second parameter is for if the property was in indexer</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #267F99">Assembly</span><span style="color: #000000"> </span><span style="color: #001080">fooAsm</span><span style="color: #000000"> = </span><span style="color: #001080">Assembly</span><span style="color: #000000">.</span><span style="color: #795E26">LoadFile</span><span style="color: #000000">(</span><span style="color: #A31515">@&quot;C:\My Path\foo.dll&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #267F99">Type</span><span style="color: #000000"> </span><span style="color: #001080">fooType</span><span style="color: #000000"> = </span><span style="color: #001080">fooAsm</span><span style="color: #000000">.</span><span style="color: #795E26">GetType</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;Foo&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #0000FF">object</span><span style="color: #000000"> </span><span style="color: #001080">foo</span><span style="color: #000000"> = </span><span style="color: #001080">Activator</span><span style="color: #000000">.</span><span style="color: #795E26">CreateInstance</span><span style="color: #000000">(</span><span style="color: #001080">fooType</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #267F99">MethodInfo</span><span style="color: #000000"> </span><span style="color: #001080">barMethod</span><span style="color: #000000"> = </span><span style="color: #001080">fooType</span><span style="color: #000000">.</span><span style="color: #795E26">GetMethod</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;Bar&quot;</span><span style="color: #000000">, </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Public</span><span style="color: #000000"> | </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Instance</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #008000">// invoke ( instance, method parameters );</span></span>
<span class="line"><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">isBar</span><span style="color: #000000"> = </span><span style="color: #001080">barMethod</span><span style="color: #000000">.</span><span style="color: #795E26">Invoke</span><span style="color: #000000">(</span><span style="color: #001080">foo</span><span style="color: #000000">, </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #0000FF">object</span><span style="color: #000000">[] { </span><span style="color: #A31515">&quot;Baz&quot;</span><span style="color: #000000"> });</span></span>
<span class="line"></span>
<span class="line"><span style="color: #267F99">MethodInfo</span><span style="color: #000000"> </span><span style="color: #001080">bingMethod</span><span style="color: #000000"> = </span><span style="color: #001080">fooType</span><span style="color: #000000">.</span><span style="color: #795E26">GetMethod</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;Bing&quot;</span><span style="color: #000000">, </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">NonPublic</span><span style="color: #000000"> | </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Instance</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #001080">bingMethod</span><span style="color: #000000">.</span><span style="color: #795E26">Invoke</span><span style="color: #000000">(</span><span style="color: #001080">foo</span><span style="color: #000000">, </span><span style="color: #0000FF">null</span><span style="color: #000000">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #267F99">PropertyInfo</span><span style="color: #000000"> </span><span style="color: #001080">propertyA</span><span style="color: #000000"> = </span><span style="color: #001080">fooType</span><span style="color: #000000">.</span><span style="color: #795E26">GetProperty</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;A&quot;</span><span style="color: #000000">, </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Public</span><span style="color: #000000"> | </span><span style="color: #001080">BindingFlags</span><span style="color: #000000">.</span><span style="color: #001080">Instance</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #001080">propertyA</span><span style="color: #000000">.</span><span style="color: #795E26">SetValue</span><span style="color: #000000">(</span><span style="color: #001080">foo</span><span style="color: #000000">, </span><span style="color: #098658">33</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">aVal</span><span style="color: #000000"> = </span><span style="color: #001080">propertyA</span><span style="color: #000000">.</span><span style="color: #795E26">GetValue</span><span style="color: #000000">(</span><span style="color: #001080">foo</span><span style="color: #000000">, </span><span style="color: #0000FF">null</span><span style="color: #000000">); </span><span style="color: #008000">// second parameter is for if the property was in indexer</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>All of which equates to the following lines of code:</p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Foo foo = new Foo();
bool isBar = foo.Bar("Baz");
foo.Bing();
foo.A = 33;
int aVal = foo.A;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #267F99">Foo</span><span style="color: #000000"> </span><span style="color: #001080">foo</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">Foo</span><span style="color: #000000">();</span></span>
<span class="line"><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">isBar</span><span style="color: #000000"> = </span><span style="color: #001080">foo</span><span style="color: #000000">.</span><span style="color: #795E26">Bar</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;Baz&quot;</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #001080">foo</span><span style="color: #000000">.</span><span style="color: #795E26">Bing</span><span style="color: #000000">();</span></span>
<span class="line"><span style="color: #001080">foo</span><span style="color: #000000">.</span><span style="color: #001080">A</span><span style="color: #000000"> = </span><span style="color: #098658">33</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">aVal</span><span style="color: #000000"> = </span><span style="color: #001080">foo</span><span style="color: #000000">.</span><span style="color: #001080">A</span><span style="color: #000000">;</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Standard CRC 16 in C#</title>
		<link>http://www.sanity-free.com/standard_crc_16_in_csharp.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Thu, 14 Dec 2006 18:00:57 +0000</pubDate>
				<category><![CDATA[C# Articles]]></category>
		<category><![CDATA[CRC]]></category>
		<category><![CDATA[CRC16]]></category>
		<category><![CDATA[CRC16-CCITT]]></category>
		<category><![CDATA[CRC16-CCITT Kermit]]></category>
		<category><![CDATA[CRC32]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=217</guid>

					<description><![CDATA[I&#8217;ve been working on a service at work that will end up being this big cluster of servers that all talk with each other.&#160; One of the things I needed was a small CRC checksum for some of the more compact UDP messages that get sent around.&#160; I thought about just using the CRC16-CCITT library [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>I&#8217;ve been working on a service at work that will end up being this big cluster of servers that all talk with each other.&nbsp; One of the things I needed was a small CRC checksum for some of the more compact UDP messages that get sent around.&nbsp; I thought about just using the CRC16-CCITT library I already had, but decided on using the standard CRC16 algorithm.&nbsp; Since I posted the CRC32 and CRC16-CCITT implementations I thought I&#8217;d post this one too.<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>using System;

public class Crc16 {
    const ushort polynomial = 0xA001;
    ushort[] table = new ushort&#91;256&#93;;

    public ushort ComputeChecksum(byte[] bytes) {
        ushort crc = 0;
        for(int i = 0; i &lt; bytes.Length; ++i) {
            byte index = (byte)(crc ^ bytes&#91;i&#93;);
            crc = (ushort)((crc >> 8) ^ table&#91;index&#93;);
        }
        return crc;
    }

    public byte[] ComputeChecksumBytes(byte[] bytes) {
        ushort crc = ComputeChecksum(bytes);
        return BitConverter.GetBytes(crc);
    }

    public Crc16() {
        ushort value;
        ushort temp;
        for(ushort i = 0; i &lt; table.Length; ++i) {
            value = 0;
            temp = i;
            for(byte j = 0; j &lt; 8; ++j) {
                if(((value ^ temp) &amp; 0x0001) != 0) {
                    value = (ushort)((value >> 1) ^ polynomial);
                }else {
                    value >>= 1;
                }
                temp >>= 1;
            }
            table&#91;i&#93; = value;
        }
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Crc16</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">const</span><span style="color: #000000"> </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">polynomial</span><span style="color: #000000"> = </span><span style="color: #098658">0xA001</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">ushort</span><span style="color: #000000">[] </span><span style="color: #001080">table</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #0000FF">ushort</span><span style="color: #000000">&#91;</span><span style="color: #098658">256</span><span style="color: #000000">&#93;;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #795E26">ComputeChecksum</span><span style="color: #000000">(</span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">bytes</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">i</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">i</span><span style="color: #000000"> &lt; </span><span style="color: #001080">bytes</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000">; ++</span><span style="color: #001080">i</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">index</span><span style="color: #000000"> = (</span><span style="color: #0000FF">byte</span><span style="color: #000000">)(</span><span style="color: #001080">crc</span><span style="color: #000000"> ^ </span><span style="color: #001080">bytes</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">&#93;);</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">crc</span><span style="color: #000000"> = (</span><span style="color: #0000FF">ushort</span><span style="color: #000000">)((</span><span style="color: #001080">crc</span><span style="color: #000000"> &gt;&gt; </span><span style="color: #098658">8</span><span style="color: #000000">) ^ </span><span style="color: #001080">table</span><span style="color: #000000">&#91;</span><span style="color: #001080">index</span><span style="color: #000000">&#93;);</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #795E26">ComputeChecksumBytes</span><span style="color: #000000">(</span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">bytes</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000"> = </span><span style="color: #795E26">ComputeChecksum</span><span style="color: #000000">(</span><span style="color: #001080">bytes</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">BitConverter</span><span style="color: #000000">.</span><span style="color: #795E26">GetBytes</span><span style="color: #000000">(</span><span style="color: #001080">crc</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #795E26">Crc16</span><span style="color: #000000">() {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">temp</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">i</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">i</span><span style="color: #000000"> &lt; </span><span style="color: #001080">table</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000">; ++</span><span style="color: #001080">i</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">value</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">temp</span><span style="color: #000000"> = </span><span style="color: #001080">i</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">j</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">j</span><span style="color: #000000"> &lt; </span><span style="color: #098658">8</span><span style="color: #000000">; ++</span><span style="color: #001080">j</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000">(((</span><span style="color: #001080">value</span><span style="color: #000000"> ^ </span><span style="color: #001080">temp</span><span style="color: #000000">) &amp; </span><span style="color: #098658">0x0001</span><span style="color: #000000">) != </span><span style="color: #098658">0</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">value</span><span style="color: #000000"> = (</span><span style="color: #0000FF">ushort</span><span style="color: #000000">)((</span><span style="color: #001080">value</span><span style="color: #000000"> &gt;&gt; </span><span style="color: #098658">1</span><span style="color: #000000">) ^ </span><span style="color: #001080">polynomial</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                }</span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">value</span><span style="color: #000000"> &gt;&gt;= </span><span style="color: #098658">1</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">temp</span><span style="color: #000000"> &gt;&gt;= </span><span style="color: #098658">1</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">table</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">&#93; = </span><span style="color: #001080">value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>If you need for this code to be CLS compliant, you can change the method signature&#8217;s return type from <code>ushort</code> to <code>int</code> and it will operate the same (the <code>ushort</code> CRC value will be implicitly converted from <code>ushort</code> to <code>int</code>)<br><br><strong>Links to the other C# CRC implementations</strong> <a href="/crc_16_ccitt_in_csharp.html">CRC16-CCITT</a>, <a href="/standard_crc16_and_crc16_kermit_implementation_in_csharp.html">CRC16-CCITT Kermit</a>, <a href="/crc32_implementation_in_csharp.html">CRC32</a>, and <a href="/crc8_implementation_in_csharp.html">CRC8</a><br><br>I&#8217;ve consolidated all of these into a single library on <a href="https://github.com/nullfx/NullFX.CRC" target="_blank" rel="noreferrer noopener">GitHub here: NullFX.CRC</a>.<br><br>I&#8217;m also very into Swift at the moment and have created Swift versions of these same classes and released a Swift PM version of this library here as well <a href="https://github.com/nullfx/NullfxCrc" target="_blank" rel="noreferrer noopener">Swift NullfxCrc Package</a></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
