<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" version="2.0">
  <channel>
    <title>altinoren.com - .Net</title>
    <link>http://altinoren.com/</link>
    <description>Gokhan Altinoren's Blog and Projects</description>
    <language>en-us</language>
    <copyright>Gokhan Altinoren</copyright>
    <lastBuildDate>Mon, 10 Nov 2008 10:40:43 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>gokhan@altinoren.com</managingEditor>
    <webMaster>gokhan@altinoren.com</webMaster>
    <item>
      <trackback:ping>http://altinoren.com/Trackback.aspx?guid=bca0aba7-dbaa-4ccf-bcf3-4d76efab1a40</trackback:ping>
      <pingback:server>http://altinoren.com/pingback.aspx</pingback:server>
      <pingback:target>http://altinoren.com/PermaLink,guid,bca0aba7-dbaa-4ccf-bcf3-4d76efab1a40.aspx</pingback:target>
      <dc:creator>Gokhan Altinoren</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">I'm sure someone did this before, but I'm
too lazy to search for it :)<br /><br />
Model Binders in MVC is a cool concept to map your form values to parameter objects
of your Action. There's also this automatic error message display capabilities in
MVC. All explained by The Gu <a href="http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx">here</a>.<br /><br />
Here's my take on validating a model object during the binding process. Castle project
has a validation framework and a range of <a href="http://hammett.castleproject.org/?p=114">validators</a> which
can be used standalone. It would be cool to use it with MVC to ease the validation
pain a bit, huh?<br /><br />
First, we need a binder to validate the object using <a href="http://www.castleproject.org">Castle</a>'s
ValidatorRunner:<br /><br /><!-- code formatted by http://manoli.net/csharpformat/ --><style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
</style><div class="csharpcode"><pre class="alt"><span class="kwrd">using</span> System.Web.Mvc;</pre><pre><span class="kwrd">using</span> Castle.Components.Validator;</pre><pre class="alt"> </pre><pre><span class="kwrd">public</span><span class="kwrd">class</span> ValidatingModelBinder
: DefaultModelBinder</pre><pre class="alt">    {</pre><pre><span class="kwrd">public</span><span class="kwrd">override</span> ModelBinderResult
BindModel(ModelBindingContext bindingContext)</pre><pre class="alt">        {</pre><pre>            var result = <span class="kwrd">base</span>.BindModel(bindingContext);</pre><pre class="alt"> </pre><pre><span class="kwrd">if</span> (result != <span class="kwrd">null</span> &amp;&amp;
result.Value != <span class="kwrd">null</span>)</pre><pre class="alt">            {</pre><pre>                var runner = <span class="kwrd">new</span> ValidatorRunner(<span class="kwrd">new</span> CachedValidationRegistry());</pre><pre class="alt"><span class="kwrd">if</span> (!runner.IsValid(result.Value))</pre><pre>                {</pre><pre class="alt">                    var summary = runner.GetErrorSummary(result.Value);</pre><pre><span class="kwrd">foreach</span> (var invalidProperty <span class="kwrd">in</span> summary.InvalidProperties)</pre><pre class="alt">                    {</pre><pre><span class="kwrd">foreach</span> (var error <span class="kwrd">in</span> summary.GetErrorsForProperty(invalidProperty))</pre><pre class="alt">                        {</pre><pre>                            bindingContext.ModelState.AddModelError(bindingContext.ModelName + <span class="str">"."</span> +
invalidProperty, error);</pre><pre class="alt">                        }</pre><pre>                    }</pre><pre class="alt">                }</pre><pre>            }</pre><pre class="alt"> </pre><pre><span class="kwrd">return</span> result;</pre><pre class="alt">        }</pre><pre>    }</pre></div><p>
And an object to validate:
</p><!-- code formatted by http://manoli.net/csharpformat/ --><style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
</style><div class="csharpcode"><pre class="alt"><span class="kwrd">using</span> Castle.Components.Validator;</pre><pre> </pre><pre class="alt"><span class="kwrd">public</span><span class="kwrd">class</span> CreateUser</pre><pre>    {</pre><pre class="alt">        [ValidateNonEmpty(<span class="str">"Please enter user name."</span>)]</pre><pre><span class="kwrd">public</span><span class="kwrd">string</span> UserName
{ get; set; }</pre><pre class="alt">        [ValidateNonEmpty(<span class="str">"Please enter password."</span>)]</pre><pre><span class="kwrd">public</span><span class="kwrd">string</span> Password
{ get; set; }</pre><pre class="alt">        [ValidateEmail(<span class="str">"Email is not valid."</span>)]</pre><pre>        [ValidateNonEmpty(<span class="str">"Please enter email address."</span>)]</pre><pre class="alt"><span class="kwrd">public</span><span class="kwrd">string</span> Email
{ get; set; }</pre><pre>    }</pre></div><p>
And an action to use the object:
</p><!-- code formatted by http://manoli.net/csharpformat/ --><style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
</style><div class="csharpcode"><pre class="alt"><span class="kwrd">public</span> ActionResult CreateUser(CreateUser
createUser)</pre><pre>        {</pre><pre class="alt"><span class="kwrd">if</span> (ViewData.ModelState.IsValid)</pre><pre>            {</pre><pre class="alt">                ViewData[<span class="str">"Message"</span>] = <span class="str">"Done."</span>;</pre><pre>            }</pre><pre class="alt"> </pre><pre><span class="kwrd">return</span> View();</pre><pre class="alt">        }</pre></div><p>
Please note that, when the action is invoked, parameter is already validated. We just
check ViewData.ModelState.IsValid and act accordingly.<br /></p><p>
Next, we'll tell the MVC engine to bind CreateUser objects through ValidatingModelBinder,
in Application_Start() of Global.asax.cs:
</p><!-- code formatted by http://manoli.net/csharpformat/ --><style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
</style><div class="csharpcode"><pre class="alt">        ModelBinders.Binders.Add(<span class="kwrd">typeof</span>(CreateUser), <span class="kwrd">new</span> ValidatingModelBinder());</pre></div><p>
So, whenever the engine is bindign to a CreateUser, our binder will execute (and validate)
the object. Finally, code below for the view:
</p><!-- code formatted by http://manoli.net/csharpformat/ --><style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
</style><div class="csharpcode"><pre class="alt"><span class="kwrd">&lt;</span><span class="html">asp:Content</span><span class="attr">ID</span><span class="kwrd">="Content1"</span><span class="attr">ContentPlaceHolderID</span><span class="kwrd">="MainContent"</span><span class="attr">runat</span><span class="kwrd">="server"</span><span class="kwrd">&gt;</span></pre><pre><span class="asp">&lt;%</span><span class="kwrd">if</span> (ViewData[<span class="str">"Message"</span>]
!= <span class="kwrd">null</span>)</pre><pre class="alt">      {<span class="asp">%&gt;</span></pre><pre><span class="asp">&lt;%</span>=ViewData[<span class="str">"Message"</span>]<span class="asp">%&gt;</span></pre><pre class="alt"><span class="asp">&lt;%</span>} <span class="asp">%&gt;</span></pre><pre><span class="asp">&lt;%</span>=Html.ValidationSummary() <span class="asp">%&gt;</span></pre><pre class="alt"><span class="kwrd">&lt;</span><span class="html">form</span><span class="attr">method</span><span class="kwrd">="post"</span><span class="attr">action</span><span class="kwrd">="/Home/CreateUser"</span><span class="kwrd">&gt;</span></pre><pre>        User name: <span class="kwrd">&lt;</span><span class="html">br</span><span class="kwrd">/&gt;</span></pre><pre class="alt"><span class="asp">&lt;%</span>=Html.TextBox(<span class="str">"CreateUser.UserName"</span>)<span class="asp">%&gt;</span><span class="asp">&lt;%</span>=Html.ValidationMessage(<span class="str">"CreateUser.UserName"</span>, <span class="str">"*"</span>)<span class="asp">%&gt;</span><span class="kwrd">&lt;</span><span class="html">br</span><span class="kwrd">/&gt;</span></pre><pre>        Password: <span class="kwrd">&lt;</span><span class="html">br</span><span class="kwrd">/&gt;</span></pre><pre class="alt"><span class="asp">&lt;%</span>=Html.Password(<span class="str">"CreateUser.Password"</span>)<span class="asp">%&gt;</span><span class="asp">&lt;%</span>=Html.ValidationMessage(<span class="str">"CreateUser.Password"</span>, <span class="str">"*"</span>)<span class="asp">%&gt;</span><span class="kwrd">&lt;</span><span class="html">br</span><span class="kwrd">/&gt;</span></pre><pre>        Email: <span class="kwrd">&lt;</span><span class="html">br</span><span class="kwrd">/&gt;</span></pre><pre class="alt"><span class="asp">&lt;%</span>=Html.TextBox(<span class="str">"CreateUser.Email"</span>)<span class="asp">%&gt;</span><span class="asp">&lt;%</span>=Html.ValidationMessage(<span class="str">"CreateUser.Email"</span>, <span class="str">"*"</span>)<span class="asp">%&gt;</span><span class="kwrd">&lt;</span><span class="html">br</span><span class="kwrd">/&gt;</span></pre><pre><span class="kwrd">&lt;</span><span class="html">input</span><span class="attr">type</span><span class="kwrd">="submit"</span><span class="attr">value</span><span class="kwrd">="Submit"</span><span class="kwrd">/&gt;</span></pre><pre class="alt"><span class="kwrd">&lt;/</span><span class="html">form</span><span class="kwrd">&gt;</span></pre><pre><span class="kwrd">&lt;/</span><span class="html">asp:Content</span><span class="kwrd">&gt;</span></pre></div><p>
Here's the result:
</p><img src="http://altinoren.com/content/binary/MVC_Castle_Validators.jpg" border="0" /><img width="0" height="0" src="http://altinoren.com/aggbug.ashx?id=bca0aba7-dbaa-4ccf-bcf3-4d76efab1a40" /></body>
      <title>Using Castle Validators with ASP.NET MVC Model Binders for Automatic Validation</title>
      <guid isPermaLink="false">http://altinoren.com/PermaLink,guid,bca0aba7-dbaa-4ccf-bcf3-4d76efab1a40.aspx</guid>
      <link>http://altinoren.com/PermaLink,guid,bca0aba7-dbaa-4ccf-bcf3-4d76efab1a40.aspx</link>
      <pubDate>Mon, 10 Nov 2008 10:40:43 GMT</pubDate>
      <description>I'm sure someone did this before, but I'm too lazy to search for it :)&lt;br&gt;
&lt;br&gt;
Model Binders in MVC is a cool concept to map your form values to parameter objects
of your Action. There's also this automatic error message display capabilities in
MVC. All explained by The Gu &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
Here's my take on validating a model object during the binding process. Castle project
has a validation framework and a range of &lt;a href="http://hammett.castleproject.org/?p=114"&gt;validators&lt;/a&gt; which
can be used standalone. It would be cool to use it with MVC to ease the validation
pain a bit, huh?&lt;br&gt;
&lt;br&gt;
First, we need a binder to validate the object using &lt;a href="http://www.castleproject.org"&gt;Castle&lt;/a&gt;'s
ValidatorRunner:&lt;br&gt;
&lt;br&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; Castle.Components.Validator;&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ValidatingModelBinder
: DefaultModelBinder&lt;/pre&gt;
&lt;pre class="alt"&gt;    {&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; ModelBinderResult
BindModel(ModelBindingContext bindingContext)&lt;/pre&gt;
&lt;pre class="alt"&gt;        {&lt;/pre&gt;
&lt;pre&gt;            var result = &lt;span class="kwrd"&gt;base&lt;/span&gt;.BindModel(bindingContext);&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (result != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp;
result.Value != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre class="alt"&gt;            {&lt;/pre&gt;
&lt;pre&gt;                var runner = &lt;span class="kwrd"&gt;new&lt;/span&gt; ValidatorRunner(&lt;span class="kwrd"&gt;new&lt;/span&gt; CachedValidationRegistry());&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (!runner.IsValid(result.Value))&lt;/pre&gt;
&lt;pre&gt;                {&lt;/pre&gt;
&lt;pre class="alt"&gt;                    var summary = runner.GetErrorSummary(result.Value);&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var invalidProperty &lt;span class="kwrd"&gt;in&lt;/span&gt; summary.InvalidProperties)&lt;/pre&gt;
&lt;pre class="alt"&gt;                    {&lt;/pre&gt;
&lt;pre&gt;                        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var error &lt;span class="kwrd"&gt;in&lt;/span&gt; summary.GetErrorsForProperty(invalidProperty))&lt;/pre&gt;
&lt;pre class="alt"&gt;                        {&lt;/pre&gt;
&lt;pre&gt;                            bindingContext.ModelState.AddModelError(bindingContext.ModelName + &lt;span class="str"&gt;"."&lt;/span&gt; +
invalidProperty, error);&lt;/pre&gt;
&lt;pre class="alt"&gt;                        }&lt;/pre&gt;
&lt;pre&gt;                    }&lt;/pre&gt;
&lt;pre class="alt"&gt;                }&lt;/pre&gt;
&lt;pre&gt;            }&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; result;&lt;/pre&gt;
&lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;pre&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
And an object to validate:
&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; Castle.Components.Validator;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CreateUser&lt;/pre&gt;
&lt;pre&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;        [ValidateNonEmpty(&lt;span class="str"&gt;"Please enter user name."&lt;/span&gt;)]&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; UserName
{ get; set; }&lt;/pre&gt;
&lt;pre class="alt"&gt;        [ValidateNonEmpty(&lt;span class="str"&gt;"Please enter password."&lt;/span&gt;)]&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Password
{ get; set; }&lt;/pre&gt;
&lt;pre class="alt"&gt;        [ValidateEmail(&lt;span class="str"&gt;"Email is not valid."&lt;/span&gt;)]&lt;/pre&gt;
&lt;pre&gt;        [ValidateNonEmpty(&lt;span class="str"&gt;"Please enter email address."&lt;/span&gt;)]&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Email
{ get; set; }&lt;/pre&gt;
&lt;pre&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
And an action to use the object:
&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult CreateUser(CreateUser
createUser)&lt;/pre&gt;
&lt;pre&gt;        {&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (ViewData.ModelState.IsValid)&lt;/pre&gt;
&lt;pre&gt;            {&lt;/pre&gt;
&lt;pre class="alt"&gt;                ViewData[&lt;span class="str"&gt;"Message"&lt;/span&gt;] = &lt;span class="str"&gt;"Done."&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;            }&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; View();&lt;/pre&gt;
&lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Please note that, when the action is invoked, parameter is already validated. We just
check ViewData.ModelState.IsValid and act accordingly.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
Next, we'll tell the MVC engine to bind CreateUser objects through ValidatingModelBinder,
in Application_Start() of Global.asax.cs:
&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        ModelBinders.Binders.Add(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(CreateUser), &lt;span class="kwrd"&gt;new&lt;/span&gt; ValidatingModelBinder());&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
So, whenever the engine is bindign to a CreateUser, our binder will execute (and validate)
the object. Finally, code below for the view:
&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Content&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="Content1"&lt;/span&gt; &lt;span class="attr"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span class="kwrd"&gt;="MainContent"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (ViewData[&lt;span class="str"&gt;"Message"&lt;/span&gt;]
!= &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre class="alt"&gt;      {&lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;=ViewData[&lt;span class="str"&gt;"Message"&lt;/span&gt;]&lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;} &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;=Html.ValidationSummary() &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt; &lt;span class="attr"&gt;method&lt;/span&gt;&lt;span class="kwrd"&gt;="post"&lt;/span&gt; &lt;span class="attr"&gt;action&lt;/span&gt;&lt;span class="kwrd"&gt;="/Home/CreateUser"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        User name: &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;=Html.TextBox(&lt;span class="str"&gt;"CreateUser.UserName"&lt;/span&gt;)&lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt; &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;=Html.ValidationMessage(&lt;span class="str"&gt;"CreateUser.UserName"&lt;/span&gt;, &lt;span class="str"&gt;"*"&lt;/span&gt;)&lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        Password: &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;=Html.Password(&lt;span class="str"&gt;"CreateUser.Password"&lt;/span&gt;)&lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt; &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;=Html.ValidationMessage(&lt;span class="str"&gt;"CreateUser.Password"&lt;/span&gt;, &lt;span class="str"&gt;"*"&lt;/span&gt;)&lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        Email: &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;=Html.TextBox(&lt;span class="str"&gt;"CreateUser.Email"&lt;/span&gt;)&lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt; &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;=Html.ValidationMessage(&lt;span class="str"&gt;"CreateUser.Email"&lt;/span&gt;, &lt;span class="str"&gt;"*"&lt;/span&gt;)&lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="submit"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="Submit"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:Content&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Here's the result:
&lt;/p&gt;
&lt;img src="http://altinoren.com/content/binary/MVC_Castle_Validators.jpg" border="0"&gt;&lt;img width="0" height="0" src="http://altinoren.com/aggbug.ashx?id=bca0aba7-dbaa-4ccf-bcf3-4d76efab1a40" /&gt;</description>
      <category>.Net</category>
      <category>Castle</category>
      <category>MVC</category>
    </item>
    <item>
      <trackback:ping>http://altinoren.com/Trackback.aspx?guid=4042474d-9a6b-4eba-a9cd-c3bbb19e7f3d</trackback:ping>
      <pingback:server>http://altinoren.com/pingback.aspx</pingback:server>
      <pingback:target>http://altinoren.com/PermaLink,guid,4042474d-9a6b-4eba-a9cd-c3bbb19e7f3d.aspx</pingback:target>
      <dc:creator>Gokhan Altinoren</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">I use CodeDom to generate ActiveRecord
classes in ActiveWriter. Quite fancy, but gets complicated easily. To generate something
like this:<br /><br /><div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="margin: 0px;">
        <span style="color: blue;">public</span><span style="color: blue;">override</span><span style="color: blue;">bool</span> Equals(<span style="color: blue;">object</span> obj)
</p><p style="margin: 0px;">
        {
</p><p style="margin: 0px;">
            <span style="color: blue;">if</span> (obj
== <span style="color: blue;">this</span>) <span style="color: blue;">return</span><span style="color: blue;">true</span>;
</p><p style="margin: 0px;">
            <span style="color: blue;">if</span> (obj
== <span style="color: blue;">null</span> || obj.GetType() != <span style="color: blue;">this</span>.GetType()) <span style="color: blue;">return</span><span style="color: blue;">false</span>;
</p><p style="margin: 0px;">
            <span style="color: teal;">MyCompositeKey</span> test
= (<span style="color: teal;">MyCompositeKey</span>)obj;
</p><p style="margin: 0px;">
            <span style="color: blue;">return</span> (_keyA
== test.KeyA || (_keyA != <span style="color: blue;">null</span> &amp;&amp; _keyA.Equals(test.KeyA)))
&amp;&amp;
</p><p style="margin: 0px;">
              (_keyB == test.KeyB
|| (_keyB != <span style="color: blue;">null</span> &amp;&amp; _keyB.Equals(test.KeyB)));
</p><p style="margin: 0px;">
        }
</p></div><br />
you code this:<br /><br /><div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="margin: 0px;"><span style="color: blue;">        private</span><span style="color: teal;">CodeTypeMember</span> GetCompositeClassEqualsMethod(<span style="color: blue;">string</span> className,  <span style="color: teal;">List</span>&lt;<span style="color: teal;">CodeMemberField</span>&gt;
fields)
</p><p style="margin: 0px;">
        {
</p><p style="margin: 0px;">
            <span style="color: teal;">CodeMemberMethod</span> equals
= <span style="color: blue;">new</span><span style="color: teal;">CodeMemberMethod</span>();
</p><p style="margin: 0px;">
            equals.Attributes = <span style="color: teal;">MemberAttributes</span>.Public
| <span style="color: teal;">MemberAttributes</span>.Override;
</p><p style="margin: 0px;">
            equals.ReturnType = <span style="color: blue;">new</span><span style="color: teal;">CodeTypeReference</span>(<span style="color: blue;">typeof</span>(<span style="color: teal;">Boolean</span>));
</p><p style="margin: 0px;">
            equals.Name = <span style="color: maroon;">"Equals"</span>;
</p><p style="margin: 0px;">
 
</p><p style="margin: 0px;">
            <span style="color: teal;">CodeParameterDeclarationExpression</span> param
= <span style="color: blue;">new</span><span style="color: teal;">CodeParameterDeclarationExpression</span>(<span style="color: blue;">typeof</span>(<span style="color: teal;">Object</span>), <span style="color: maroon;">"obj"</span>);
</p><p style="margin: 0px;">
            equals.Parameters.Add(param);
</p><p style="margin: 0px;">
 
</p><p style="margin: 0px;">
            equals.Statements.Add(<span style="color: blue;">new</span><span style="color: teal;">CodeConditionStatement</span>(
</p><p style="margin: 0px;">
                   
                  <span style="color: blue;">new</span><span style="color: teal;">CodeBinaryOperatorExpression</span>(
</p><p style="margin: 0px;">
                   
                   
  <span style="color: blue;">new</span><span style="color: teal;">CodeFieldReferenceExpression</span>(<span style="color: blue;">null</span>, <span style="color: maroon;">"obj"</span>),
</p><p style="margin: 0px;">
                   
                   
  <span style="color: teal;">CodeBinaryOperatorType</span>.ValueEquality, <span style="color: blue;">new</span><span style="color: teal;">CodeThisReferenceExpression</span>()
</p><p style="margin: 0px;">
                   
                   
  ), <span style="color: blue;">new</span><span style="color: teal;">CodeMethodReturnStatement</span>(<span style="color: blue;">new</span><span style="color: teal;">CodePrimitiveExpression</span>(<span style="color: blue;">true</span>))
</p><p style="margin: 0px;">
                   
                 
)
</p><p style="margin: 0px;">
                );
</p><p style="margin: 0px;">
 
</p><p style="margin: 0px;">
            equals.Statements.Add(<span style="color: blue;">new</span><span style="color: teal;">CodeConditionStatement</span></p><p style="margin: 0px;">
                   
                 
(
</p><p style="margin: 0px;">
                   
                  <span style="color: blue;">new</span><span style="color: teal;">CodeBinaryOperatorExpression</span></p><p style="margin: 0px;">
                   
                   
  (
</p><p style="margin: 0px;">
                   
                   
  <span style="color: blue;">new</span><span style="color: teal;">CodeBinaryOperatorExpression</span>(
</p><p style="margin: 0px;">
                   
                   
      <span style="color: blue;">new</span><span style="color: teal;">CodeFieldReferenceExpression</span>(<span style="color: blue;">null</span>, <span style="color: maroon;">"obj"</span>),
</p><p style="margin: 0px;">
                   
                   
      <span style="color: teal;">CodeBinaryOperatorType</span>.ValueEquality, <span style="color: blue;">new</span><span style="color: teal;">CodePrimitiveExpression</span>(<span style="color: blue;">null</span>)),
</p><p style="margin: 0px;">
                   
                   
  <span style="color: teal;">CodeBinaryOperatorType</span>.BooleanOr,
</p><p style="margin: 0px;">
                   
                   
  <span style="color: blue;">new</span><span style="color: teal;">CodeBinaryOperatorExpression</span>(
</p><p style="margin: 0px;">
                   
                   
      <span style="color: blue;">new</span><span style="color: teal;">CodeMethodInvokeExpression</span>(<span style="color: blue;">new</span><span style="color: teal;">CodeFieldReferenceExpression</span>(<span style="color: blue;">null</span>, <span style="color: maroon;">"obj"</span>), <span style="color: maroon;">"GetType"</span>),
</p><p style="margin: 0px;">
                   
                   
      <span style="color: teal;">CodeBinaryOperatorType</span>.IdentityInequality,
</p><p style="margin: 0px;">
                   
                   
      <span style="color: blue;">new</span><span style="color: teal;">CodeMethodInvokeExpression</span>(<span style="color: blue;">new</span><span style="color: teal;">CodeThisReferenceExpression</span>(), <span style="color: maroon;">"GetType"</span>))
</p><p style="margin: 0px;">
                   
                   
  )
</p><p style="margin: 0px;">
                   
                 
, <span style="color: blue;">new</span><span style="color: teal;">CodeMethodReturnStatement</span>(<span style="color: blue;">new</span><span style="color: teal;">CodePrimitiveExpression</span>(<span style="color: blue;">false</span>))
</p><p style="margin: 0px;">
                   
                 
)
</p><p style="margin: 0px;">
                );
</p><p style="margin: 0px;">
 
</p><p style="margin: 0px;">
            equals.Statements.Add(
</p><p style="margin: 0px;">
                <span style="color: blue;">new</span><span style="color: teal;">CodeVariableDeclarationStatement</span>(<span style="color: blue;">new</span><span style="color: teal;">CodeTypeReference</span>(className), <span style="color: maroon;">"test"</span>,
</p><p style="margin: 0px;">
                   
                   
            <span style="color: blue;">new</span><span style="color: teal;">CodeCastExpression</span>(<span style="color: blue;">new</span><span style="color: teal;">CodeTypeReference</span>(className),
</p><p style="margin: 0px;">
                   
                   
                   
                <span style="color: blue;">new</span><span style="color: teal;">CodeFieldReferenceExpression</span>(<span style="color: blue;">null</span>, <span style="color: maroon;">"obj"</span>))));
</p><p style="margin: 0px;">
 
</p><p style="margin: 0px;">
            <span style="color: teal;">List</span>&lt;<span style="color: teal;">CodeExpression</span>&gt;
expressions = <span style="color: blue;">new</span><span style="color: teal;">List</span>&lt;<span style="color: teal;">CodeExpression</span>&gt;();
</p><p style="margin: 0px;">
            <span style="color: blue;">foreach</span> (<span style="color: teal;">CodeMemberField</span> field <span style="color: blue;">in</span> fields)
</p><p style="margin: 0px;">
            {
</p><p style="margin: 0px;">
                expressions.Add(
</p><p style="margin: 0px;">
                    <span style="color: blue;">new</span><span style="color: teal;">CodeBinaryOperatorExpression</span>(
</p><p style="margin: 0px;">
                   
    <span style="color: green;">//_keyA == test.KeyA</span></p><p style="margin: 0px;">
                   
    <span style="color: blue;">new</span><span style="color: teal;">CodeBinaryOperatorExpression</span>(
</p><p style="margin: 0px;">
                   
        <span style="color: blue;">new</span><span style="color: teal;">CodeFieldReferenceExpression</span>(<span style="color: blue;">null</span>,
field.Name),
</p><p style="margin: 0px;">
                   
        <span style="color: teal;">CodeBinaryOperatorType</span>.ValueEquality,
</p><p style="margin: 0px;">
                   
        <span style="color: blue;">new</span><span style="color: teal;">CodeFieldReferenceExpression</span>(<span style="color: blue;">new</span><span style="color: teal;">CodeFieldReferenceExpression</span>(<span style="color: blue;">null</span>, <span style="color: maroon;">"test"</span>),
field.Name)),
</p><p style="margin: 0px;">
                   
    <span style="color: teal;">CodeBinaryOperatorType</span>.BooleanOr, <span style="color: green;">//
||</span></p><p style="margin: 0px;">
                   
    <span style="color: blue;">new</span><span style="color: teal;">CodeBinaryOperatorExpression</span>(
</p><p style="margin: 0px;">
                   
        <span style="color: green;">//_keyA != null</span></p><p style="margin: 0px;">
                   
        <span style="color: blue;">new</span><span style="color: teal;">CodeBinaryOperatorExpression</span>(
</p><p style="margin: 0px;">
                   
            <span style="color: blue;">new</span><span style="color: teal;">CodeFieldReferenceExpression</span>(<span style="color: blue;">null</span>,
field.Name),
</p><p style="margin: 0px;">
                   
            <span style="color: teal;">CodeBinaryOperatorType</span>.IdentityInequality,
</p><p style="margin: 0px;">
                   
            <span style="color: blue;">new</span><span style="color: teal;">CodePrimitiveExpression</span>(<span style="color: blue;">null</span>)
</p><p style="margin: 0px;">
                   
            ),
</p><p style="margin: 0px;">
                   
        <span style="color: teal;">CodeBinaryOperatorType</span>.BooleanAnd, <span style="color: green;">//
&amp;&amp;</span></p><p style="margin: 0px;">
                   
        <span style="color: green;">// _keyA.Equals(
test.KeyA )   </span></p><p style="margin: 0px;">
                   
        <span style="color: blue;">new</span><span style="color: teal;">CodeMethodInvokeExpression</span>(
</p><p style="margin: 0px;">
                   
            <span style="color: blue;">new</span><span style="color: teal;">CodeFieldReferenceExpression</span>(<span style="color: blue;">null</span>,
field.Name), <span style="color: maroon;">"Equals"</span>,
</p><p style="margin: 0px;">
                   
            <span style="color: blue;">new</span><span style="color: teal;">CodeFieldReferenceExpression</span>(
</p><p style="margin: 0px;">
                   
                <span style="color: blue;">new</span><span style="color: teal;">CodeFieldReferenceExpression</span>(<span style="color: blue;">null</span>, <span style="color: maroon;">"test"</span>),
field.Name))
</p><p style="margin: 0px;">
                   
        )
</p><p style="margin: 0px;">
                   
    )
</p><p style="margin: 0px;">
                   
);
</p><p style="margin: 0px;">
            }
</p><p style="margin: 0px;">
 
</p><p style="margin: 0px;">
            <span style="color: teal;">CodeExpression</span> expression
= <span style="color: blue;">null</span>;
</p><p style="margin: 0px;">
            <span style="color: blue;">if</span> (expressions.Count
&gt; 2)
</p><p style="margin: 0px;">
                expression
=
</p><p style="margin: 0px;">
                    <span style="color: blue;">new</span><span style="color: teal;">CodeBinaryOperatorExpression</span>(expressions[0], <span style="color: teal;">CodeBinaryOperatorType</span>.BooleanAnd,
GetBooleanAnd(expressions, 1));
</p><p style="margin: 0px;">
            <span style="color: blue;">else</span></p><p style="margin: 0px;">
                expression
= <span style="color: blue;">new</span><span style="color: teal;">CodeBinaryOperatorExpression</span>(expressions[0], <span style="color: teal;">CodeBinaryOperatorType</span>.BooleanAnd,
expressions[1]);
</p><p style="margin: 0px;">
 
</p><p style="margin: 0px;">
 
</p><p style="margin: 0px;">
            equals.Statements.Add(<span style="color: blue;">new</span><span style="color: teal;">CodeMethodReturnStatement</span>(expression));
</p><p style="margin: 0px;">
 
</p><p style="margin: 0px;">
            <span style="color: blue;">return</span> equals;
</p><p style="margin: 0px;">
        }
</p></div><br />
Strangely, there's no <span style="color: teal;">CodeBinaryOperatorType</span>.ValueInequality
operator defined. (a==b)==false will do the trick, but how about not having an XOR?
I find CodeDom's lack of completeness... disturbing.<br /><p></p><img width="0" height="0" src="http://altinoren.com/aggbug.ashx?id=4042474d-9a6b-4eba-a9cd-c3bbb19e7f3d" /></body>
      <title>Generating Code? Wear a CodeDom</title>
      <guid isPermaLink="false">http://altinoren.com/PermaLink,guid,4042474d-9a6b-4eba-a9cd-c3bbb19e7f3d.aspx</guid>
      <link>http://altinoren.com/PermaLink,guid,4042474d-9a6b-4eba-a9cd-c3bbb19e7f3d.aspx</link>
      <pubDate>Mon, 28 Aug 2006 21:46:29 GMT</pubDate>
      <description>I use CodeDom to generate ActiveRecord classes in ActiveWriter. Quite fancy, but gets complicated easily. To generate something like this:&lt;br&gt;
&lt;br&gt;
&lt;div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; Equals(&lt;span style="color: blue;"&gt;object&lt;/span&gt; obj)
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (obj
== &lt;span style="color: blue;"&gt;this&lt;/span&gt;) &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;true&lt;/span&gt;;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (obj
== &lt;span style="color: blue;"&gt;null&lt;/span&gt; || obj.GetType() != &lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetType()) &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;false&lt;/span&gt;;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal;"&gt;MyCompositeKey&lt;/span&gt; test
= (&lt;span style="color: teal;"&gt;MyCompositeKey&lt;/span&gt;)obj;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; (_keyA
== test.KeyA || (_keyA != &lt;span style="color: blue;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; _keyA.Equals(test.KeyA)))
&amp;amp;&amp;amp;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; (_keyB == test.KeyB
|| (_keyB != &lt;span style="color: blue;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; _keyB.Equals(test.KeyB)));
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;/p&gt;
&lt;/div&gt;
&lt;br&gt;
you code this:&lt;br&gt;
&lt;br&gt;
&lt;div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;
&lt;p style="margin: 0px;"&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeTypeMember&lt;/span&gt; GetCompositeClassEqualsMethod(&lt;span style="color: blue;"&gt;string&lt;/span&gt; className,&amp;nbsp; &lt;span style="color: teal;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: teal;"&gt;CodeMemberField&lt;/span&gt;&amp;gt;
fields)
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal;"&gt;CodeMemberMethod&lt;/span&gt; equals
= &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeMemberMethod&lt;/span&gt;();
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; equals.Attributes = &lt;span style="color: teal;"&gt;MemberAttributes&lt;/span&gt;.Public
| &lt;span style="color: teal;"&gt;MemberAttributes&lt;/span&gt;.Override;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; equals.ReturnType = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeTypeReference&lt;/span&gt;(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: teal;"&gt;Boolean&lt;/span&gt;));
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; equals.Name = &lt;span style="color: maroon;"&gt;"Equals"&lt;/span&gt;;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal;"&gt;CodeParameterDeclarationExpression&lt;/span&gt; param
= &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeParameterDeclarationExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: teal;"&gt;Object&lt;/span&gt;), &lt;span style="color: maroon;"&gt;"obj"&lt;/span&gt;);
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; equals.Parameters.Add(param);
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; equals.Statements.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeConditionStatement&lt;/span&gt;(
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeBinaryOperatorExpression&lt;/span&gt;(
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeFieldReferenceExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;null&lt;/span&gt;, &lt;span style="color: maroon;"&gt;"obj"&lt;/span&gt;),
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp; &lt;span style="color: teal;"&gt;CodeBinaryOperatorType&lt;/span&gt;.ValueEquality, &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeThisReferenceExpression&lt;/span&gt;()
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp; ), &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeMethodReturnStatement&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodePrimitiveExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;true&lt;/span&gt;))
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;
)
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; );
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; equals.Statements.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeConditionStatement&lt;/span&gt;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;
(
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeBinaryOperatorExpression&lt;/span&gt;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp; (
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeBinaryOperatorExpression&lt;/span&gt;(
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeFieldReferenceExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;null&lt;/span&gt;, &lt;span style="color: maroon;"&gt;"obj"&lt;/span&gt;),
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;CodeBinaryOperatorType&lt;/span&gt;.ValueEquality, &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodePrimitiveExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;null&lt;/span&gt;)),
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp; &lt;span style="color: teal;"&gt;CodeBinaryOperatorType&lt;/span&gt;.BooleanOr,
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeBinaryOperatorExpression&lt;/span&gt;(
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeMethodInvokeExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeFieldReferenceExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;null&lt;/span&gt;, &lt;span style="color: maroon;"&gt;"obj"&lt;/span&gt;), &lt;span style="color: maroon;"&gt;"GetType"&lt;/span&gt;),
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;CodeBinaryOperatorType&lt;/span&gt;.IdentityInequality,
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeMethodInvokeExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeThisReferenceExpression&lt;/span&gt;(), &lt;span style="color: maroon;"&gt;"GetType"&lt;/span&gt;))
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp; )
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;
, &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeMethodReturnStatement&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodePrimitiveExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;false&lt;/span&gt;))
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;
)
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; );
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; equals.Statements.Add(
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeVariableDeclarationStatement&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeTypeReference&lt;/span&gt;(className), &lt;span style="color: maroon;"&gt;"test"&lt;/span&gt;,
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeCastExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeTypeReference&lt;/span&gt;(className),
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeFieldReferenceExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;null&lt;/span&gt;, &lt;span style="color: maroon;"&gt;"obj"&lt;/span&gt;))));
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: teal;"&gt;CodeExpression&lt;/span&gt;&amp;gt;
expressions = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: teal;"&gt;CodeExpression&lt;/span&gt;&amp;gt;();
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: teal;"&gt;CodeMemberField&lt;/span&gt; field &lt;span style="color: blue;"&gt;in&lt;/span&gt; fields)
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; expressions.Add(
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeBinaryOperatorExpression&lt;/span&gt;(
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//_keyA == test.KeyA&lt;/span&gt;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeBinaryOperatorExpression&lt;/span&gt;(
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeFieldReferenceExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;null&lt;/span&gt;,
field.Name),
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal;"&gt;CodeBinaryOperatorType&lt;/span&gt;.ValueEquality,
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeFieldReferenceExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeFieldReferenceExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;null&lt;/span&gt;, &lt;span style="color: maroon;"&gt;"test"&lt;/span&gt;),
field.Name)),
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal;"&gt;CodeBinaryOperatorType&lt;/span&gt;.BooleanOr, &lt;span style="color: green;"&gt;//
||&lt;/span&gt;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeBinaryOperatorExpression&lt;/span&gt;(
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//_keyA != null&lt;/span&gt;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeBinaryOperatorExpression&lt;/span&gt;(
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeFieldReferenceExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;null&lt;/span&gt;,
field.Name),
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal;"&gt;CodeBinaryOperatorType&lt;/span&gt;.IdentityInequality,
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodePrimitiveExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;null&lt;/span&gt;)
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ),
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal;"&gt;CodeBinaryOperatorType&lt;/span&gt;.BooleanAnd, &lt;span style="color: green;"&gt;//
&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// _keyA.Equals(
test.KeyA )&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeMethodInvokeExpression&lt;/span&gt;(
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeFieldReferenceExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;null&lt;/span&gt;,
field.Name), &lt;span style="color: maroon;"&gt;"Equals"&lt;/span&gt;,
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeFieldReferenceExpression&lt;/span&gt;(
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeFieldReferenceExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;null&lt;/span&gt;, &lt;span style="color: maroon;"&gt;"test"&lt;/span&gt;),
field.Name))
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; )
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; )
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
);
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal;"&gt;CodeExpression&lt;/span&gt; expression
= &lt;span style="color: blue;"&gt;null&lt;/span&gt;;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (expressions.Count
&amp;gt; 2)
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; expression
=
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeBinaryOperatorExpression&lt;/span&gt;(expressions[0], &lt;span style="color: teal;"&gt;CodeBinaryOperatorType&lt;/span&gt;.BooleanAnd,
GetBooleanAnd(expressions, 1));
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; expression
= &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeBinaryOperatorExpression&lt;/span&gt;(expressions[0], &lt;span style="color: teal;"&gt;CodeBinaryOperatorType&lt;/span&gt;.BooleanAnd,
expressions[1]);
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; equals.Statements.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;CodeMethodReturnStatement&lt;/span&gt;(expression));
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; equals;
&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;/p&gt;
&lt;/div&gt;
&lt;br&gt;
Strangely, there's no &lt;span style="color: teal;"&gt;CodeBinaryOperatorType&lt;/span&gt;.ValueInequality
operator defined. (a==b)==false will do the trick, but how about not having an XOR?
I find CodeDom's lack of completeness... disturbing.&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://altinoren.com/aggbug.ashx?id=4042474d-9a6b-4eba-a9cd-c3bbb19e7f3d" /&gt;</description>
      <category>.Net</category>
      <category>ActiveWriter</category>
      <category>Code Generation</category>
    </item>
  </channel>
</rss>