<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>AppDev: Something You Should Know by Irena Kennedy</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/irenak/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/irenak/feed.xml</link>
    <description>Everything that is related to application development, and other cool stuff...</description>
    <lastBuildDate>Thu, 01 Dec 2016 23:43:24 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>SYSK 398: How to deploy .dacpac to SQL Azure from Azure block blob</title>
      <link>https://docs.microsoft.com/archive/blogs/irenak/sysk-398-how-to-deploy-dacpac-to-sql-azure-from-azure-block-blob</link>
      <pubDate>Thu, 01 Dec 2016 23:43:24 GMT</pubDate>
      <dc:creator><![CDATA[irenake]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/irenak/?p=4865</guid>
      <description><![CDATA[Here is a quick-and-dirty (i.e. clean-up and optimize to your liking) way of doing...]]></description>
      <content:encoded><![CDATA[Here is a quick-and-dirty (i.e. clean-up and optimize to your liking) way of doing it:

&nbsp;

Import-Module "sqlps" -DisableNameChecking

$srv = new-object Microsoft.SqlServer.Management.Smo.Server("YOURSERVER.database.windows.net")
$conContext = $srv.ConnectionContext
$conContext.LoginSecure = $FALSE
$conContext.Login = "YOUR_USER"
$conContext.Password = "YOUR_PASSWORD"

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Dac.dll")
$serverconnection = New-Object Microsoft.SqlServer.Management.Common.ServerConnection($srv.ConnectionContext.SqlConnectionObject)
$serverconnection.Connect()

$dacpacPath = "https://YOURNAME.blob.core.windows.net/YOURCONTAINER/YOURFILE.dacpac"
$object = New-Object Net.WebClient
$dpfile = $object.DownloadData($dacpacPath)
$ms = New-Object IO.MemoryStream
$ms.Write($dpfile, 0, $dpfile.Length)

$d = new-object Microsoft.SqlServer.Dac.DacServices($serverconnection)
$dp = [Microsoft.SqlServer.Dac.DacPackage]::Load($ms, 1)
$d.deploy($dp, "test", $TRUE)]]></content:encoded>
    </item>
    <item>
      <title>SYSK 397: Xamarin-Forms-Labs CalendarView control is not rendered in Win8 phone</title>
      <link>https://docs.microsoft.com/archive/blogs/irenak/sysk-397-xamarin-forms-labs-calendarview-control-is-not-rendered-in-win8-phone</link>
      <pubDate>Wed, 13 Jan 2016 08:34:42 GMT</pubDate>
      <dc:creator><![CDATA[irenake]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/irenak/2016/01/13/sysk-397-xamarin-forms-labs-calendarview-control-is-not-rendered-in-win8-phone/</guid>
      <description><![CDATA[If you downloaded XLabs open source controls from https://github.com/XLabs/Xamarin-Forms-Labs and...]]></description>
      <content:encoded><![CDATA[<p>If you downloaded XLabs open source controls from <a href="https://github.com/XLabs/Xamarin-Forms-Labs">https://github.com/XLabs/Xamarin-Forms-Labs</a> and trying to use them in a Xamarin project targeting Windows phone 8, you may be having "blank" rendering (calendar not displayed)&nbsp;issue - note that the space for the control is taken which can be seen by setting control's background property.&nbsp; I had this issue attempting to use Calendar control using XLabs.Forms.WP8, Version=2.0.5782.12223 version.&nbsp;</p>
<p>I believe the issue is in the fact that that assembly targets WinPhone 8.1&nbsp;-- &nbsp;[assembly: TargetFramework("WindowsPhone,Version=v8.1", FrameworkDisplayName = "Windows Phone 8.1")].&nbsp; If your project is targeting WinPhone 8.0 (and not 8.1),&nbsp;the XLabs.Forms.WP8.dll is not deployed even if it is referenced.&nbsp; That means that there is no associated renderer for the Calendar control.</p>
<p>One way to work around the issue is to add your own renderer for it in .WinPhone project, e.g.:</p>
<p>[assembly: ExportRenderer(typeof(XLabs.Forms.Controls.CalendarView), typeof(YourNamespace.CalendarViewRenderer))]</p>
<p>public class CalendarViewRenderer : ViewRenderer&lt;CalendarView, Calendar&gt;<br />{<br />&nbsp;&nbsp;&nbsp; Calendar calendar = null;</p>
<p>&nbsp;&nbsp;&nbsp; public CalendarViewRenderer() : base()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; calendar = new Calendar();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; calendar.DateClicked += Calendar_DateClicked;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; protected override void OnElementChanged(ElementChangedEventArgs&lt;CalendarView&gt; e)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.SetNativeControl(calendar);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.OnElementChanged(e);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private void Calendar_DateClicked(object sender, WPControls.SelectionChangedEventArgs e)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.Element.NotifyDateSelected(e.SelectedDate);<br />&nbsp;&nbsp;&nbsp; }<br />}</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>SYSK 396: FxCop Rules for RESTful API</title>
      <link>https://docs.microsoft.com/archive/blogs/irenak/sysk-396-fxcop-rules-for-restful-api</link>
      <pubDate>Mon, 24 Aug 2015 14:48:00 GMT</pubDate>
      <dc:creator><![CDATA[irenake]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/irenak/2015/08/24/sysk-396-fxcop-rules-for-restful-api/</guid>
      <description><![CDATA[There are a few well known basic naming rules providing a consistent, understandable REST API...]]></description>
      <content:encoded><![CDATA[<div class="WordSection1">
<p>There are a few well known basic naming rules providing a consistent, understandable REST API services, e.g.</p>
<ul>
<li>The scheme and host name are not case sensitive; however, the path and query should be treated as case sensitive.</li>
<li>Lowercase letters are preferred in URI paths.&nbsp;</li>
<li>Do use hyphens (-) between words to improve readability of URI</li>
<li>Do not use underscore (_) in URIs as this character is often virtually indistinguishable when the content is underlined.</li>
</ul>
<p>However, quite a few WebAPIs I&rsquo;ve seen do not adhere to these conventions, so I created (quick and dirty, not fully tested and not production ready) FxCop rules that check for underscores and capital letters in WebAPI implementations.&nbsp; Feel free to create a dll library type of project, add the files from the listings below and use it in your projects.</p>
<p>&nbsp;</p>
<p><strong>WebApiBaseNamingRule.cs</strong><strong></strong></p>
<p>using System;</p>
<p>using System.Collections.Generic;</p>
<p>using System.Linq;</p>
<p>using System.Text;</p>
<p>using System.Threading.Tasks;</p>
<p>using Microsoft.FxCop.Sdk;</p>
<p>using System.Threading;</p>
<p>using YOURCOMPANY.CodeQuality;</p>
<p>using System.Web.Http.Routing;</p>
<p>using System.Web.Http;</p>
<p>&nbsp;</p>
<p>namespace YOURCOMPANY.CodeQuality.WebAPI</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp; public abstract class WebApiBaseNamingRule : BaseIntrospectionRule</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private static Dictionary&lt;string, HttpRoute[]&gt; KnownRoutes = new Dictionary&lt;string, HttpRoute[]&gt;();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected static string[] KnownVerbs = Enum.GetNames(typeof(System.Web.Mvc.HttpVerbs));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public WebApiBaseNamingRule(string name, string resourceName)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : base(name, resourceName, typeof(WebApiBaseNamingRule).Assembly)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public abstract ProblemCollection Check(string checkTemplate, string routeTemplate);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public override ProblemCollection Check(Member member)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var routes = GetRegisteredApiRoutes(member);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (member.DeclaringType.ConstructorName.ToString() == "WebApiConfig" &amp;&amp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; member.NodeType == NodeType.Method&amp;&amp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (member as Method).Parameters.Count == 1 &amp;&amp; (member as Method).Parameters[0].Type.FullName == "System.Web.Http.HttpConfiguration")</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach(var r in routes)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Only check literals, i.e. don't check placeholers as they will be replaced when WebAPI is actually used</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string validateTemplate = RemoteRoutePlaceholders(r.RouteTemplate);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Check(validateTemplate, r.RouteTemplate);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (member.DeclaringType.IsApiController()&amp;&amp;&nbsp; member.IsPublic &amp;&amp; !member.IsSpecialName)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string template = null;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (member.HasCustomAttribute("System.Web.Http.RouteAttribute"))</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var a = member.GetCustomAttribute("System.Web.Http.RouteAttribute");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (a.Expressions.Count &gt; 0)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Literal l = a.Expressions[0] as Literal;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (l != null)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; template = l.Value as string;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (string.IsNullOrEmpty(template) &amp;&amp; member.NodeType == NodeType.Method)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get matching template</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string controllerName = RemoveSuffix(member.DeclaringType.Name.ToString(), "controller");</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var requiredParamsArray = (from p in (member as Method).Parameters</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where p.IsOptional == false &amp;&amp; p.IsOut == false&nbsp;&nbsp; // note: IsIn is only set to true if parameter has [in] attribute</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select "{" + p.Name + "}").ToArray();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string requiredParams = string.Join("/", requiredParamsArray);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;var action = "/" + member.Name.ToString();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (IsHttpVerb(member.Name.ToString())) // Matching logic in System.Web.Http (packages\Microsoft.AspNet.WebApi.Core.5.2.2\lib\net45\System.Web.Http.dll)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; action = "";</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; template = "{controller}" + action +</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (string.IsNullOrEmpty(requiredParams) ? "" : "/" + requiredParams);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach(var r in routes)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string rt = r.RouteTemplate;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (rt.EndsWith(template))</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; template = rt.Substring(0, rt.Length - requiredParams.Length);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!string.IsNullOrEmpty(template))</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string validateTemplate = RemoteRoutePlaceholders(template);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Check(validateTemplate, template);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return base.Check(member);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.Problems;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private bool IsHttpVerb(string method)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool result = false;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!string.IsNullOrEmpty(method))</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = (from v in KnownVerbs</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where string.Compare(method, v, true) == 0</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select v).Any();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;private string RemoteRoutePlaceholders(string template)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;char&gt; r = new List&lt;char&gt;();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool skip = false;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach(var c in template.ToCharArray())</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (c == '{')</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skip = true;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!skip)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r.Add(c);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (c == '}')</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skip = false;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string result = new string(r.ToArray());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (result.IndexOf("//") != -1)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = result.Replace("//", "/");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private HttpRoute[] GetRegisteredApiRoutes(Member member)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;HttpRoute&gt; routeList = new List&lt;HttpRoute&gt;();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var a = member.DeclaringType.ContainingAssembly().Name;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lock (KnownRoutes)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!KnownRoutes.ContainsKey(a))</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // NOTE: this assumes the class name wasn't changed from one generated by VS project template</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO: make it more versatile</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var webApiCofig = (from t in member.DeclaringType.ContainingAssembly().Types</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where t.ConstructorName.ToString() == "WebApiConfig"</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select t).FirstOrDefault();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var registerMethod = (from m in webApiCofig.Members</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where m.NodeType == NodeType.Method</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let tm = m as Method</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from p in tm.Parameters</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where tm.Parameters.Count == 1 &amp;&amp; tm.Parameters[0].Type.FullName == "System.Web.Http.HttpConfiguration"</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select tm).FirstOrDefault();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var registeredRoutes = (from ms in registerMethod.Body.Statements</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where ms.NodeType == NodeType.Block</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let b = (ms as Block)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from s in b.Statements</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where s.NodeType == NodeType.ExpressionStatement</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let ex = s as ExpressionStatement</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where ex.Expression is UnaryExpression</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let uex = ex.Expression as UnaryExpression</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where uex.Operand is Microsoft.FxCop.Sdk.NaryExpression&amp;&amp;&nbsp; uex.Operand.Type.FullName == "System.Web.Http.Routing.IHttpRoute"</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select (uex.Operand as Microsoft.FxCop.Sdk.NaryExpression).Operands).ToArray();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (var r in registeredRoutes)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpRoute route = null;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var operands = r.ToArray();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Skip the first operand which is MethodCall</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 1; i &lt; operands.Length; i++)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO: add handling for constraints</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (i)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //case 1:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp; // Get this for debugging/tracing purposes</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp; name = operands[i].ToString();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp; break;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 2:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //template = operands[i].ToString();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; route = new HttpRoute(operands[i].ToString());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 3:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var operandName = operands[i].Type.Members.Last().Name;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (var o in (operands[i] as Construct).Operands)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; route.Defaults.Add(operandName.ToString(), o);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //if (o.NodeType == NodeType.MemberBinding)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp; if ((o as MemberBinding).BoundMember.FullName == "System.Web.Http.RouteParameter.Optional")</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string newTemplate = template.ReplaceOrdinal("/{" + operandName.ToString() + "}", "");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; routeList.Add(newTemplate);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//else if (o.NodeType == NodeType.Literal)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp; string newTemplate = template.ReplaceOrdinal("{" + operandName.ToString() + "}", (o as Literal).Value.ToString());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp; //System.Diagnostics.Debug.WriteLine(newTemplate);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp; routeList.Add(newTemplate);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 4:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //handler = operands[i].ToString();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; routeList.Add(route);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KnownRoutes.Add(a, routeList.ToArray());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return KnownRoutes[a];</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string RemoveSuffix(string name, string suffix, bool caseInsensitive = true)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string result = name;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string s = caseInsensitive ? suffix.ToLower() : suffix;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string n = caseInsensitive ? name.ToLower() : name;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (n.EndsWith(s))</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = name.Substring(0, name.Length - suffix.Length);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected WordInfo[] Words(string template)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;WordInfo&gt; result = new List&lt;WordInfo&gt;();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var wordParser = new WordParser(template, WordParserOptions.SplitCompoundWords);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string word = null;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int processedIndex = 0;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((word = wordParser.NextWord()) != null)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i = template.IndexOf(word, processedIndex);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i &gt; processedIndex)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.Add(new WordInfo(template.Substring(processedIndex, i - processedIndex), false));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;result.Add(new WordInfo(word, true));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processedIndex = i + word.Length;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (processedIndex &lt; template.Length)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.Add(new WordInfo(template.Substring(processedIndex), false));</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result.ToArray();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected struct WordInfo</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string Text;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public bool IsWord;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public WordInfo(string text, bool isWord)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Text = text;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IsWord = isWord;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>WebApiRouteShouldNotContainCapitalLetters.cs</strong><strong></strong></p>
<p>using Microsoft.FxCop.Sdk;</p>
<p>using System;</p>
<p>using System.Collections.Generic;</p>
<p>using System.Linq;</p>
<p>using System.Text;</p>
<p>using System.Threading.Tasks;</p>
<p>&nbsp;</p>
<p>namespace YOURCOMPANY.CodeQuality.WebAPI</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp; // Important: this implementation only checks for controller and action names, not route part registered via config.Routes.MapHttpRoute</p>
<p>&nbsp;&nbsp;&nbsp; public class WebApiRouteShouldNotContainCapitalLetters : WebApiBaseNamingRule</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public WebApiRouteShouldNotContainCapitalLetters()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : base("WebApiRouteShouldNotContainCapitalLetters", "YOURCOMPANY.CodeQuality.Rules")</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public override Microsoft.FxCop.Sdk.ProblemCollection Check(string checkTemplate, string routeTemplate)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool isValid = true;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string validTemplate = string.Empty;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool precededByWord = false;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string validWord = string.Empty;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (var w in Words(checkTemplate))</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; isValid&amp; = IsValid(w.Text, precededByWord, out validWord);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validTemplate += validWord;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; precededByWord = w.IsWord;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!isValid)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;validTemplate = routeTemplate.Replace(checkTemplate, validTemplate);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Problems.Add(new Problem(this.GetResolution(routeTemplate, validTemplate)));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.Problems;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private bool IsValid(string word, bool preceededByWord, out string validWord)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool result = true;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;char&gt; validChars = new List&lt;char&gt;();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (char c in word.ToCharArray())</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (char.IsUpper(c))</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = false;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (preceededByWord)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validChars.Add('-');</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validChars.Add(char.ToLower(c));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validChars.Add(c);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validWord = new string(validChars.ToArray());</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;</p>
<p>}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>WebApiRouteShouldNotContainUnderscores.cs</strong><strong></strong></p>
<p>using Microsoft.FxCop.Sdk;</p>
<p>using System;</p>
<p>using System.Collections.Generic;</p>
<p>using System.Linq;</p>
<p>using System.Text;</p>
<p>using System.Threading.Tasks;</p>
<p>&nbsp;</p>
<p>namespace YOURCOMPANY.CodeQuality.WebAPI</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp; public class WebApiRouteShouldNotContainUnderscores : WebApiBaseNamingRule</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public WebApiRouteShouldNotContainUnderscores()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : base("WebApiRouteShouldNotContainUnderscores", "YOURCOMPANY.CodeQuality.Rules")</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public override Microsoft.FxCop.Sdk.ProblemCollection Check(string checkTemplate, string routeTemplate)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (checkTemplate.IndexOf('_') != -1)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Problems.Add(new Problem(this.GetResolution(routeTemplate)));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.Problems;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>WebApiRouteShouldUseHyphenToSeparateWords.cs</strong><strong></strong></p>
<p>using Microsoft.FxCop.Sdk;</p>
<p>using System;</p>
<p>using System.Collections.Generic;</p>
<p>using System.Linq;</p>
<p>using System.Text;</p>
<p>using System.Threading.Tasks;</p>
<p>&nbsp;</p>
<p>namespace YOURCOMPANY.CodeQuality.WebAPI</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp; public class WebApiRouteShouldUseHyphenToSeparateWords : WebApiBaseNamingRule</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public WebApiRouteShouldUseHyphenToSeparateWords()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : base("WebApiRouteShouldUseHyphenToSeparateWords", "YOURCOMPANY.CodeQuality.Rules")</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public override Microsoft.FxCop.Sdk.ProblemCollection Check(string checkTemplate, string routeTemplate)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool isValid = true;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string validTemplate = string.Empty;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var words = Words(checkTemplate);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; words.Length; i++)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WordInfo w = words[i];</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i &gt; 0 &amp;&amp; w.IsWord &amp;&amp; words[i - 1].IsWord)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; isValid = false;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validTemplate += "-";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validTemplate += w.Text.ToLower();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!isValid)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validTemplate = routeTemplate.Replace(checkTemplate, validTemplate);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Problems.Add(new Problem(this.GetResolution(routeTemplate, validTemplate)));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.Problems;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;</p>
<p>}</p>
<p>&nbsp;</p>
<p><strong>ClassFieldNamePrefixes.cs</strong><strong></strong></p>
<p>using System;</p>
<p>using System.Collections.Generic;</p>
<p>using System.Linq;</p>
<p>using System.Text;</p>
<p>using System.Threading.Tasks;</p>
<p>using Microsoft.FxCop.Sdk;</p>
<p>using System.Threading;</p>
<p>&nbsp;</p>
<p>namespace YOURCOMPANY.CodeQuality</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp; public class ClassFieldNamePrefixes : BaseIntrospectionRule</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ClassFieldNamePrefixes() :</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base("ClassFieldNamePrefixes", "YOURCOMPANY.CodeQuality.Rules", typeof(ClassFieldNamePrefixes).Assembly)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public override ProblemCollection Check(Member member)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!(member.DeclaringType is ClassNode))</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.Problems;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field fld = member as Field;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fld == null)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.Problems;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fld.IsStatic&amp;&amp; !fld.Name.Name.StartsWith("s_", StringComparison.Ordinal)&amp;&amp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fld.Name.Name != "__ENCList") // Ignore edit-and-continue debugging fields</p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Problems.Add(new Problem(this.GetNamedResolution("Static", fld.Name.Name)));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (!fld.Name.Name.StartsWith("_", StringComparison.Ordinal)&amp;&amp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fld.Name.Name != "__ENCList"&amp;&amp;&nbsp; fld.Name.Name != "components")</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Problems.Add(new Problem(this.GetNamedResolution("Instance", fld.Name.Name)));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.Problems;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>ExtensionMethods</strong><strong>\String.cs</strong></p>
<p>using System;</p>
<p>using System.Collections.Generic;</p>
<p>using System.Linq;</p>
<p>using System.Text;</p>
<p>using System.Threading.Tasks;</p>
<p>&nbsp;</p>
<p>namespace YOURCOMPANY.CodeQuality</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp; public static class StringExtensionMethods</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Replace s1 with s2 in orig (find is case-insensitive)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static string ReplaceOrdinalIgnoreCase(this string orig, string s1, string s2)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string result = orig;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i1 = orig.ToLower().IndexOf(s1.ToLower());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i1 != -1)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i1 == 0)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = string.Empty;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = orig.Substring(0, i1);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result += s2;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i2 = i1 + s1.Length;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i2 &lt; orig.Length)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result += orig.Substring(i2);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;</p>
<p>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>ExtensionMethods</strong><strong>\TypeNode.cs</strong></p>
<p>using Microsoft.FxCop.Sdk;</p>
<p>using System;</p>
<p>using System.Collections.Generic;</p>
<p>using System.Linq;</p>
<p>using System.Text;</p>
<p>using System.Threading.Tasks;</p>
<p>&nbsp;</p>
<p>namespace YOURCOMPANY.CodeQuality</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp; public static class TypeExtensionMethods</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;public static bool IsApiController(this TypeNode t)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool result = false;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t = t.BaseType;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (t != null &amp;&amp; t.Name.Name == "ApiController")</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = true;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } while (t != null &amp;&amp; result == false);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p><strong>&nbsp;</strong></p>
<p><strong>&nbsp;</strong></p>
<p><strong>Rules.xml</strong></p>
<p>&lt;?xml version="1.0" encoding="utf-8"?&gt;</p>
<p>&lt;Rules FriendlyName="Code Quality Rules"&gt;</p>
<p>&nbsp; &lt;!-- WebAPI Rules.&nbsp; Check ids range 1001 - 1999--&gt;</p>
<p>&nbsp; &lt;Rule TypeName="WebApiRouteShouldNotContainUnderscores" Category="YourCompany.CodeQuality" CheckId="FA1001"&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Name&gt;Web API route should use hyphen (-) instead of undercore (_).&lt;/Name&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Description&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Do not use underscore (_) in URIs as this character is often virtually indistinguishable when the content is underlined.</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/Description&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Url&gt;&lt;/Url&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Resolution&gt;Use hyphen instead of underscore in route '{0}' .&lt;/Resolution&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;MessageLevel Certainty="95"&gt;Warning&lt;/MessageLevel&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Email&gt;&lt;/Email&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;FixCategories&gt;Breaking&lt;/FixCategories&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Owner&gt;Microsoft, Corp.&lt;/Owner&gt;</p>
<p>&nbsp; &lt;/Rule&gt;</p>
<p>&nbsp; &lt;Rule TypeName="WebApiRouteShouldNotContainCapitalLetters" Category="YourCompany.CodeQuality" CheckId="FA1002"&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Name&gt;Lowercase letters are preferred in URI paths.&lt;/Name&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Description&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Web API route should use hyphen (-) to separate compound words instead of Pascal or Camel case naming convention.</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/Description&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Url&gt;&lt;/Url&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Resolution&gt;Change from {0} route to {1} .&lt;/Resolution&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;MessageLevel Certainty="95"&gt;Warning&lt;/MessageLevel&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Email&gt;&lt;/Email&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;FixCategories&gt;Breaking&lt;/FixCategories&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Owner&gt;Microsoft, Corp.&lt;/Owner&gt;</p>
<p>&nbsp; &lt;/Rule&gt;</p>
<p>&nbsp; &lt;Rule TypeName="WebApiRouteShouldUseHyphenToSeparateWords" Category="YourCompany.CodeQuality" CheckId="FA1003"&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Name&gt;Use hyphens (-) between words to improve readability of URIs&lt;/Name&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Description&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Web API route should use hyphen (-) to separate compound words</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/Description&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Url&gt;&lt;/Url&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Resolution&gt;Change from {0} route to {1} .&lt;/Resolution&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;MessageLevel Certainty="95"&gt;Warning&lt;/MessageLevel&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Email&gt;&lt;/Email&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;FixCategories&gt;Breaking&lt;/FixCategories&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Owner&gt;Microsoft, Corp.&lt;/Owner&gt;</p>
<p>&nbsp; &lt;/Rule&gt;</p>
<p>&lt;/Rules&gt;</p>
<p><strong>&nbsp;</strong></p>
</div>]]></content:encoded>
    </item>
    <item>
      <title>SYSK 395: DataAnnotations: ConditionallyRequiredAttribute with lamda expressions</title>
      <link>https://docs.microsoft.com/archive/blogs/irenak/sysk-395-dataannotations-conditionallyrequiredattribute-with-lamda-expressions</link>
      <pubDate>Mon, 19 Jan 2015 09:33:00 GMT</pubDate>
      <dc:creator><![CDATA[irenake]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/irenak/2015/01/19/sysk-395-dataannotations-conditionallyrequiredattribute-with-lamda-expressions/</guid>
      <description><![CDATA[Back in 2010, Jeff Hanley published a sample of a ConditionallyRequiredAttribute that used a name of...]]></description>
      <content:encoded><![CDATA[<p>Back in 2010, Jeff Hanley published a sample of a ConditionallyRequiredAttribute that used a name of another property for runtime condition verification.&nbsp; The original source can be found at<em> </em><a href="https://jeffhandley.com/archive/2010/09/26/RiaServicesCustomReusableValidators.aspx"><em>https://jeffhandley.com/archive/2010/09/26/RiaServicesCustomReusableValidators.aspx</em></a>.&nbsp;</p>
<p>I took the liberty to update it to support lambda expressions, allowing for more complex rules, e.g.</p>
<p><span style="font-family: courier new,courier;">[ConditionallyRequired(typeof(YourClass), "(x) =&gt; { return x.Prop1 == 5 &amp;&amp; x.Prop2; }")]</span></p>
<p>&nbsp;Here is the resulting code:</p>
<p><span style="font-family: courier new,courier;">/// &lt;summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">/// </span><span style="font-family: courier new,courier;">Make a member required under a certain condition.</span></p>
<p><span style="font-family: courier new,courier;">/// &lt;/summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">/// &lt;remarks&gt;</span></p>
<p><span style="font-family: courier new,courier;">/// </span><span style="font-family: courier new,courier;">Override the attribute usage to allow multiple attributes to be applied.</span></p>
<p><span style="font-family: courier new,courier;">/// </span><span style="font-family: courier new,courier;">This requires that the TypeId property be overridden on the desktop framework.</span></p>
<p><span style="font-family: courier new,courier;">/// &lt;/remarks&gt;</span></p>
<p><span style="font-family: courier new,courier;">[AttributeUsage(AttributeTargets.Property </span><span style="font-family: courier new,courier;">| AttributeTargets.Field | AttributeTargets.Parameter, </span><span style="font-family: courier new,courier;">AllowMultiple = true)]</span></p>
<p><span style="font-family: courier new,courier;">public class ConditionallyRequiredAttribute : </span><span style="font-family: courier new,courier;">RequiredAttribute</span></p>
<p><span style="font-family: courier new,courier;">{</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; private Func&lt;dynamic, bool&gt; </span><span style="font-family: courier new,courier;">_predicate = null;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; private MemberInfo </span><span style="font-family: courier new,courier;">_member;</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">The name of the member that will return the state that indicates</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// whether </span><span style="font-family: courier new,courier;">or not the validated member is required.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string </span><span style="font-family: courier new,courier;">ConditionMember { get; private set; </span><span style="font-family: courier new,courier;">}</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">The condition value under which this validator treats</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">the affected member as required.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public object </span><span style="font-family: courier new,courier;">RequiredCondition { get; private set; </span><span style="font-family: courier new,courier;">}</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">Comma-separated list of additional members to</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">add to validation errors.&nbsp; By default, </span><span style="font-family: courier new,courier;">the</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;see </span><span style="font-family: courier new,courier;">cref="ConditionMember"/&gt; is added.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string </span><span style="font-family: courier new,courier;">ErrorMembers { get; set; </span><span style="font-family: courier new,courier;">}</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">Conditionally require a value, only when the specified</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;paramref </span><span style="font-family: courier new,courier;">name="conditionMember"/&gt; is &lt;c&gt;true&lt;/c&gt;.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;param </span><span style="font-family: courier new,courier;">name="conditionMember"&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// The </span><span style="font-family: courier new,courier;">member that must be &lt;c&gt;true&lt;/c&gt; </span><span style="font-family: courier new,courier;">to require a value.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;/param&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public </span><span style="font-family: courier new,courier;">ConditionallyRequiredAttribute(string </span><span style="font-family: courier new,courier;">conditionMember)</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : this(conditionMember, </span><span style="font-family: courier new,courier;">true) { }</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">Conditionally require a value, only when the specified</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;paramref </span><span style="font-family: courier new,courier;">name="conditionMember"/&gt; has a value </span><span style="font-family: courier new,courier;">that</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">exactly matches the &lt;paramref </span><span style="font-family: courier new,courier;">name="requiredCondition"/&gt;.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;param </span><span style="font-family: courier new,courier;">name="conditionMember"&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">The member that will be evaluated to require a value.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp; &nbsp;/// &lt;/param&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;param </span><span style="font-family: courier new,courier;">name="requiredCondition"&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">The value the &lt;paramref </span><span style="font-family: courier new,courier;">name="conditionMember"/&gt; must</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">hold to require a value.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;/param&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public </span><span style="font-family: courier new,courier;">ConditionallyRequiredAttribute(string </span><span style="font-family: courier new,courier;">conditionMember, object requiredCondition)</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ConditionMember </span><span style="font-family: courier new,courier;">= conditionMember;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.RequiredCondition </span><span style="font-family: courier new,courier;">= requiredCondition;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ErrorMembers </span><span style="font-family: courier new,courier;">= this.ConditionMember;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; // NOTE: </span><span style="font-family: courier new,courier;">requires that the type being validated has a parameterized constructor!</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public </span><span style="font-family: courier new,courier;">ConditionallyRequiredAttribute(Type </span><span style="font-family: courier new,courier;">type, string predicate)</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _predicate = predicate.ToFunc(type);</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">Override the base validation to only perform validation when the required</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// condition </span><span style="font-family: courier new,courier;">has been met.&nbsp; In the case of validation </span><span style="font-family: courier new,courier;">failure, augment the</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">validation result with the &lt;see </span><span style="font-family: courier new,courier;">cref="ErrorMembers"/&gt; as an </span><span style="font-family: courier new,courier;">additional</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">member names, as needed.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;param </span><span style="font-family: courier new,courier;">name="value"&gt;The value being validated.&lt;/param&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;param </span><span style="font-family: courier new,courier;">name="validationContext"&gt;The validation </span><span style="font-family: courier new,courier;">context being used.&lt;/param&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;see </span><span style="font-family: courier new,courier;">cref="ValidationResult.Success"/&gt; if not </span><span style="font-family: courier new,courier;">currently required or if satisfied,</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">or a &lt;see cref="ValidationResult"/&gt; </span><span style="font-family: courier new,courier;">in the case of failure.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;/returns&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; protected override ValidationResult </span><span style="font-family: courier new,courier;">IsValid(object value, ValidationContext </span><span style="font-family: courier new,courier;">validationContext)</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ValidationResult </span><span style="font-family: courier new,courier;">result = ValidationResult.Success;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if </span><span style="font-family: courier new,courier;">(_predicate != null)</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Add SEH</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool </span><span style="font-family: courier new,courier;">condition = _predicate(validationContext.ObjectInstance);</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if </span><span style="font-family: courier new,courier;">(condition)</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = base.IsValid(value, </span><span style="font-family: courier new,courier;">validationContext);</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (this.DiscoverMember(validationContext.ObjectType))</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; object </span><span style="font-family: courier new,courier;">state = this.InvokeMember(validationContext.ObjectInstance);</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // We are only </span><span style="font-family: courier new,courier;">required if the current state</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // matches the </span><span style="font-family: courier new,courier;">specified condition.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (Object.Equals(state, </span><span style="font-family: courier new,courier;">this.RequiredCondition))</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = base.IsValid(value, </span><span style="font-family: courier new,courier;">validationContext);</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if </span><span style="font-family: courier new,courier;">(result != ValidationResult.Success &amp;&amp; this.ErrorMembers </span><span style="font-family: courier new,courier;">!= null &amp;&amp; this.ErrorMembers.Any())</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = new ValidationResult(result.ErrorMessage,</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: courier new,courier;">result.MemberNames.Union(this.ErrorMembers.Split(',').Select(s</span><br /><span style="font-family: courier new,courier;">=&gt; s.Trim())));</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return </span><span style="font-family: courier new,courier;">result;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ValidationResult.Success;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;else</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new InvalidOperationException(</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "ConditionallyRequiredAttribute </span><span style="font-family: courier new,courier;">could not discover member: " + this.ConditionMember);</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;<span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return </span><span style="font-family: courier new,courier;">result;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// Discover </span><span style="font-family: courier new,courier;">the member that we will evaluate for checking our condition.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;param </span><span style="font-family: courier new,courier;">name="objectType"&gt;&lt;/param&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;&lt;/returns&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; private bool </span><span style="font-family: courier new,courier;">DiscoverMember(Type objectType)</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this._member </span><span style="font-family: courier new,courier;">== null)</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this._member </span><span style="font-family: courier new,courier;">= (from member in </span><span style="font-family: courier new,courier;">objectType.GetMember(this.ConditionMember).Cast&lt;MemberInfo&gt;()</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where </span><span style="font-family: courier new,courier;">IsSupportedProperty(member) || IsSupportedMethod(member)</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select </span><span style="font-family: courier new,courier;">member).SingleOrDefault();</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // If we </span><span style="font-family: courier new,courier;">didn't find 1 exact match, indicate that we could not discover the member</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this._member </span><span style="font-family: courier new,courier;">!= null;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">Determine if a &lt;paramref name="member"/&gt; </span><span style="font-family: courier new,courier;">is a</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">method that accepts no parameters.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;param </span><span style="font-family: courier new,courier;">name="member"&gt;The member to check.&lt;/param&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;c&gt;true&lt;/c&gt; </span><span style="font-family: courier new,courier;">if the member is a parameterless method.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">Otherwise, &lt;c&gt;false&lt;/c&gt;.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;/returns&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; private bool </span><span style="font-family: courier new,courier;">IsSupportedMethod(MemberInfo member)</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if </span><span style="font-family: courier new,courier;">(member.MemberType != MemberTypes.Method)</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MethodInfo </span><span style="font-family: courier new,courier;">method = (MethodInfo)member;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return </span><span style="font-family: courier new,courier;">method.GetParameters().Length == 0</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; method.GetGenericArguments().Length </span><span style="font-family: courier new,courier;">== 0</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; method.ReturnType != typeof(void);</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">Determine if a &lt;paramref name="member"/&gt; </span><span style="font-family: courier new,courier;">is a</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">property that has no indexer.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;param </span><span style="font-family: courier new,courier;">name="member"&gt;The member to check.&lt;/param&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;c&gt;true&lt;/c&gt; </span><span style="font-family: courier new,courier;">if the member is a non-indexed property.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">Otherwise, &lt;c&gt;false&lt;/c&gt;.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;/returns&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; private bool </span><span style="font-family: courier new,courier;">IsSupportedProperty(MemberInfo member)</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if </span><span style="font-family: courier new,courier;">(member.MemberType != MemberTypes.Property)</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PropertyInfo </span><span style="font-family: courier new,courier;">property = (PropertyInfo)member;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return </span><span style="font-family: courier new,courier;">property.GetIndexParameters().Length == 0;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">Invoke the member and return its value.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp; &nbsp;&nbsp;/// &lt;/summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;param </span><span style="font-family: courier new,courier;">name="objectInstance"&gt;The object to </span><span style="font-family: courier new,courier;">invoke against.&lt;/param&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;The </span><span style="font-family: courier new,courier;">member's return value.&lt;/returns&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; private object </span><span style="font-family: courier new,courier;">InvokeMember(object </span><span style="font-family: courier new,courier;">objectInstance)</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this._member.MemberType </span><span style="font-family: courier new,courier;">== MemberTypes.Method)</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MethodInfo </span><span style="font-family: courier new,courier;">method = (MethodInfo)this._member;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return </span><span style="font-family: courier new,courier;">method.Invoke(objectInstance, null);</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PropertyInfo </span><span style="font-family: courier new,courier;">property = (PropertyInfo)this._member;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return </span><span style="font-family: courier new,courier;">property.GetValue(objectInstance, null);</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">#if</span><br /><span style="font-family: courier new,courier;">!SILVERLIGHT</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">The desktop framework has this property and it must be</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">overridden when allowing multiple attributes, so that</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">attribute instances can be disambiguated based on</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// </span><span style="font-family: courier new,courier;">field values.</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public override object </span><span style="font-family: courier new,courier;">TypeId</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { </span><span style="font-family: courier new,courier;">return this; </span><span style="font-family: courier new,courier;">}</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">#endif</span></p>
<p><span style="font-family: courier new,courier;">}</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">internal static class StringExtensions</span></p>
<p><span style="font-family: courier new,courier;">{</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public static Func&lt;dynamic, bool&gt; </span><span style="font-family: courier new,courier;">ToFunc(this string predicate, Type </span><span style="font-family: courier new,courier;">type)</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Func&lt;dynamic, bool&gt; </span><span style="font-family: courier new,courier;">result = null;</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO: Add </span><span style="font-family: courier new,courier;">error checking/validation (e.g. check the the type being validated has a </span><span style="font-family: courier new,courier;">parameterized constructor, etc.)</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dictionary&lt;string, string&gt; </span><span style="font-family: courier new,courier;">providerOptions = new Dictionary&lt;string, string&gt;();</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Version v </span><span style="font-family: courier new,courier;">= typeof(ConstantExpression).Assembly.GetName().Version;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; providerOptions.Add("CompilerVersion", "v" + </span><span style="font-family: courier new,courier;">v.Major.ToString() + "." + </span><span style="font-family: courier new,courier;">v.Minor.ToString());</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CSharpCodeProvider </span><span style="font-family: courier new,courier;">provider = new CSharpCodeProvider(providerOptions);</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CompilerResults </span><span style="font-family: courier new,courier;">results = provider.CompileAssemblyFromSource(</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new CompilerParameters(new[] </span><span style="font-family: courier new,courier;">{ "System.Core.dll", "Microsoft.CSharp.dll" </span><span style="font-family: courier new,courier;">})</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GenerateExecutable = false,</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GenerateInMemory = true</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@"using </span><span style="font-family: courier new,courier;">System;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using System.Linq.Expressions;</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class ExpressionExtensions</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Func&lt;dynamic, </span><span style="font-family: courier new,courier;">bool&gt; expr { get { return " + predicate + </span><span style="font-family: courier new,courier;">@"; } }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }");</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if </span><span style="font-family: courier new,courier;">(results.Errors.HasErrors)</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (CompilerError </span><span style="font-family: courier new,courier;">err in results.Errors)</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO: </span><span style="font-family: courier new,courier;">Log/throw as needed</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Diagnostics.Debug.WriteLine(err.ErrorText);</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;{</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var </span><span style="font-family: courier new,courier;">asm = results.CompiledAssembly;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var p </span><span style="font-family: courier new,courier;">= asm.GetType("ExpressionExtensions").GetProperty("expr", BindingFlags.Static </span><span style="font-family: courier new,courier;">| BindingFlags.Public);</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = (Func&lt;dynamic, bool&gt;)p.GetGetMethod().Invoke(Activator.CreateInstance(type), </span><span style="font-family: courier new,courier;">null);</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return </span><span style="font-family: courier new,courier;">result;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">}</span></p>]]></content:encoded>
    </item>
    <item>
      <title>SYSK 394: Cost of getting StackTrace and finding a StackFrame</title>
      <link>https://docs.microsoft.com/archive/blogs/irenak/sysk-394-cost-of-getting-stacktrace-and-finding-a-stackframe</link>
      <pubDate>Sat, 27 Sep 2014 08:24:16 GMT</pubDate>
      <dc:creator><![CDATA[irenake]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/irenak/2014/09/27/sysk-394-cost-of-getting-stacktrace-and-finding-a-stackframe/</guid>
      <description><![CDATA[I wanted to find out the overhead of getting the stack trace and finding a specific method in the...]]></description>
      <content:encoded><![CDATA[<p>I wanted to find out the overhead of getting the stack trace and finding a specific method in the array of stack frames.&nbsp; The profiled code looked like this:</p>
<p style="padding-left: 30px;"><span style="font-family: verdana,geneva; font-size: xx-small;">private static MethodBase GetCallerMethod(string caller)</span></p>
<p style="padding-left: 30px;"><span style="font-family: verdana,geneva; font-size: xx-small;">{</span></p>
<p style="padding-left: 30px;"><span style="font-family: verdana,geneva; font-size: xx-small;">&nbsp;&nbsp;&nbsp; StackTrace st = new StackTrace(2);</span></p>
<p style="padding-left: 30px;"><span style="font-family: verdana,geneva; font-size: xx-small;">&nbsp;&nbsp;&nbsp; return (from f in st.GetFrames() let m = f.GetMethod() where m.Name == caller select m).FirstOrDefault();</span></p>
<p style="padding-left: 30px;"><span style="font-family: verdana,geneva; font-size: xx-small;">}</span></p>
<p>&nbsp;</p>
<p>I used QueryThreadCycleTime API or more precise measurements</p>
<p style="padding-left: 30px;"><span style="font-family: verdana,geneva; font-size: xx-small;">[DllImport("kernel32.dll")]</span></p>
<p style="padding-left: 30px;"><span style="font-family: verdana,geneva; font-size: xx-small;">[return: MarshalAs(UnmanagedType.Bool)]</span></p>
<p style="padding-left: 30px;"><span style="font-family: verdana,geneva; font-size: xx-small;">static extern bool QueryThreadCycleTime(IntPtr ThreadHandle, out ulong CycleTime);</span></p>
<p style="padding-left: 30px;"><span style="font-family: verdana,geneva; font-size: xx-small;">[DllImport("kernel32.dll")]</span></p>
<p style="padding-left: 30px;"><span style="font-family: verdana,geneva; font-size: xx-small;">static extern IntPtr GetCurrentThread();</span></p>
<p>&nbsp;</p>
<p>and here is what I found out for my test case:</p>
<ul>
<li>Average CPU cycles to get StackFrame[]:&nbsp; ~500,000</li>
<li>Average CPU cycles for Linq query to find the calling method (which is usually near the top of the stack): ~70,000</li>
<li>In comparison, a call to a local SQL server database to execute a stored procedure (getting a record based on primary key) on a very small database (narrow, well indexed tables with &lt; 100 rows): &nbsp;~910,000</li>
</ul>
<p>In summary, based on my tests, the cost of finding a stack frame is in the same ballpark as making a stored procedure call on a very small (sample) well indexed database residing on the same machine.</p>]]></content:encoded>
    </item>
    <item>
      <title>SYSK 393: Error: Cannot obtain Metadata (RESOLVED)</title>
      <link>https://docs.microsoft.com/archive/blogs/irenak/sysk-393-error-cannot-obtain-metadata-resolved</link>
      <pubDate>Mon, 01 Sep 2014 08:58:46 GMT</pubDate>
      <dc:creator><![CDATA[irenake]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/irenak/2014/09/01/sysk-393-error-cannot-obtain-metadata-resolved/</guid>
      <description><![CDATA[Not all error messages are created equal, and some of them are less helpful than others.&nbsp; Here...]]></description>
      <content:encoded><![CDATA[<p><span style="font-family: arial,helvetica,sans-serif; font-size: small;">Not all error messages are created equal, and some of them are less helpful than others.&nbsp; Here is one I came across --&nbsp;<strong> "Metadata contains a reference that cannot be resolved...&nbsp; An exception was thrown in a call to a WSDL export extension:</strong></span><br /><span style="font-family: arial,helvetica,sans-serif; font-size: small;"><strong>System.ServiceModel.Description.DataContractSerializerOperationBehavior contract...&nbsp; Type</strong> 'YourNamespace.YourClass'<strong> cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute.&nbsp; If the type is a collection, consider marking it with the CollectionDataContractAttribute.&nbsp;"</strong></span></p>
<p><span style="font-family: arial,helvetica,sans-serif; font-size: small;"><strong>If your class and data members are marked with appropriate attributes, check to see if your class has a default constructor.&nbsp;</strong> At the time of writing this post, using .NET 4.5 or 4.5.1 (I did not check other .net versions), you will get this error if your data class doesn&rsquo;t have a parameterized constructor.</span></p>
<p><span style="font-family: arial,helvetica,sans-serif; font-size: small;">Here is the exception with the call stack:</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier; font-size: x-small;">Error: Cannot obtain Metadata from <a href="https://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/mex">https://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/mex</a></span><br /><span style="font-family: courier new,courier; font-size: x-small;">If this is a Windows (R) Communication Foundation service to which you have</span><br /><span style="font-family: courier new,courier; font-size: x-small;">access, please check that you have enabled metadata publishing at the specified</span><br /><span style="font-family: courier new,courier; font-size: x-small;">address.&nbsp; For help enabling metadata</span><br /><span style="font-family: courier new,courier; font-size: x-small;">publishing, please refer to the MSDN documentation at <a href="https://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata">https://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata</a></span><br /><span style="font-family: courier new,courier; font-size: x-small;">Exchange Error&nbsp;&nbsp;&nbsp; URI: <a href="https://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/mex">https://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/mex</a>&nbsp;&nbsp;&nbsp; Metadata contains a reference that cannot</span><br /><span style="font-family: courier new,courier; font-size: x-small;">be resolved:</span><br /><span style="font-family: courier new,courier; font-size: x-small;">'https://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/mex'.&nbsp;&nbsp;&nbsp; &lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;Fault</span><br /><span style="font-family: courier new,courier; font-size: x-small;">xmlns="<a href="https://www.w3.org/2003/05/soap-envelope">https://www.w3.org/2003/05/soap-envelope</a>"&gt;&lt;Code&gt;&lt;Value&gt;Receiver&lt;/Value&gt;&lt;Subcode&gt;&lt;Value</span><br /><span style="font-family: courier new,courier; font-size: x-small;">xmlns:a="<a href="https://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">https://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher</a>"&gt;a:InternalServiceFault&lt;/Value&gt;&lt;/Subcode&gt;&lt;/Code&gt;&lt;Reason&gt;&lt;Text</span><br /><span style="font-family: courier new,courier; font-size: x-small;">xml:lang="en-US"&gt;An exception was thrown in a call to a WSDL</span><br /><span style="font-family: courier new,courier; font-size: x-small;">export extension:</span><br /><span style="font-family: courier new,courier; font-size: x-small;">System.ServiceModel.Description.DataContractSerializerOperationBehavior contract:</span><br /><span style="font-family: courier new,courier; font-size: x-small;"><a href="https://tempuri.org/:IService1%3c/Text%3e%3c/Reason%3e%3cDetail">https://tempuri.org/:IService1&lt;/Text&gt;&lt;/Reason&gt;&lt;Detail</a></span><br /><span style="font-family: courier new,courier; font-size: x-small;">xmlns:s="<a href="https://www.w3.org/2003/05/soap-envelope">https://www.w3.org/2003/05/soap-envelope</a>"&gt;&lt;ExceptionDetail</span><br /><span style="font-family: courier new,courier; font-size: x-small;">xmlns="<a href="https://schemas.datacontract.org/2004/07/System.ServiceModel">https://schemas.datacontract.org/2004/07/System.ServiceModel</a>"</span><br /><span style="font-family: courier new,courier; font-size: x-small;">xmlns:i="<a href="https://www.w3.org/2001/XMLSchema-instance">https://www.w3.org/2001/XMLSchema-instance</a>"&gt;&lt;HelpLink</span><br /><span style="font-family: courier new,courier; font-size: x-small;">i:nil="true"&gt;&lt;/HelpLink&gt;&lt;InnerException&gt;&lt;HelpLink</span><br /><span style="font-family: courier new,courier; font-size: x-small;">i:nil="true"&gt;&lt;/HelpLink&gt;&lt;InnerException</span><br /><span style="font-family: courier new,courier; font-size: x-small;">i:nil="true"&gt;&lt;/InnerException&gt;&lt;Message&gt;Type</span><br /><span style="font-family: courier new,courier; font-size: x-small;">'ClassLibrary2.Phone' cannot be serialized. Consider marking it with the</span><br /><span style="font-family: courier new,courier; font-size: x-small;">DataContractAttribute attribute, and marking all of its members you want</span><br /><span style="font-family: courier new,courier; font-size: x-small;">serialized with the DataMemberAttribute attribute.&nbsp; If the type is a collection, consider marking</span><br /><span style="font-family: courier new,courier; font-size: x-small;">it with the CollectionDataContractAttribute.&nbsp;</span><br /><span style="font-family: courier new,courier; font-size: x-small;">See the Microsoft .NET Framework documentation for other supported</span><br /><span style="font-family: courier new,courier; font-size: x-small;">types.&lt;/Message&gt;&lt;StackTrace&gt;&nbsp;&nbsp;</span><br /><span style="font-family: courier new,courier; font-size: x-small;">at</span><br /><span style="font-family: courier new,courier; font-size: x-small;">System.Runtime.Serialization.DataContract.DataContractCriticalHelper.ThrowInvalidDataContractException(String</span><br /><span style="font-family: courier new,courier; font-size: x-small;">message, Type type)&nbsp;&nbsp; at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32</span><br /><span style="font-family: courier new,courier; font-size: x-small;">id, RuntimeTypeHandle typeHandle, Type type)&nbsp;&nbsp;</span><br /><span style="font-family: courier new,courier; font-size: x-small;">at System.Runtime.Serialization.DataContract.GetDataContract(Int32 id,</span><br /><span style="font-family: courier new,courier; font-size: x-small;">RuntimeTypeHandle typeHandle, SerializationMode mode)&nbsp;&nbsp; at System.Runtime.Serialization.DataContractSet.AddCollectionDataContract(CollectionDataContract</span><br /><span style="font-family: courier new,courier; font-size: x-small;">collectionDataContract)&nbsp;&nbsp; at</span><br /><span style="font-family: courier new,courier; font-size: x-small;">System.Runtime.Serialization.DataContractSet.InternalAdd(XmlQualifiedName name,</span><br /><span style="font-family: courier new,courier; font-size: x-small;">DataContract dataContract)&nbsp;&nbsp; at</span><br /><span style="font-family: courier new,courier; font-size: x-small;">System.Runtime.Serialization.DataContractSet.AddClassDataContract(ClassDataContract</span><br /><span style="font-family: courier new,courier; font-size: x-small;">classDataContract)&nbsp;&nbsp; at</span><br /><span style="font-family: courier new,courier; font-size: x-small;">System.Runtime.Serialization.DataContractSet.InternalAdd(XmlQualifiedName name,</span><br /><span style="font-family: courier new,courier; font-size: x-small;">DataContract dataContract)&nbsp;&nbsp; at</span><br /><span style="font-family: courier new,courier; font-size: x-small;">System.Runtime.Serialization.XsdDataContractExporter.Export(Type type)&nbsp;&nbsp; at</span><br /><span style="font-family: courier new,courier; font-size: x-small;">System.ServiceModel.Description.MessageContractExporter.ExportType(Type type,</span><br /><span style="font-family: courier new,courier; font-size: x-small;">String partName, String operationName, XmlSchemaType&amp;amp; xsdType)&nbsp;&nbsp; at</span><br /><span style="font-family: courier new,courier; font-size: x-small;">System.ServiceModel.Description.DataContractSerializerMessageContractExporter.ExportBody(Int32</span><br /><span style="font-family: courier new,courier; font-size: x-small;">messageIndex, Object state)&nbsp;&nbsp; at</span><br /><span style="font-family: courier new,courier; font-size: x-small;">System.ServiceModel.Description.MessageContractExporter.ExportMessage(Int32</span><br /><span style="font-family: courier new,courier; font-size: x-small;">messageIndex, Object state)&nbsp;&nbsp; at</span><br /><span style="font-family: courier new,courier; font-size: x-small;">System.ServiceModel.Description.MessageContractExporter.ExportMessageContract()&nbsp;&nbsp; at System.ServiceModel.Description.WsdlExporter.CallExtension(WsdlContractConversionContext</span><br /><span style="font-family: courier new,courier; font-size: x-small;">contractContext, IWsdlExportExtension</span><br /><span style="font-family: courier new,courier; font-size: x-small;">extension)&lt;/StackTrace&gt;&lt;Type&gt;System.Runtime.Serialization.InvalidDataContractException&lt;/Type&gt;&lt;/InnerException&gt;&lt;Message&gt;An</span><br /><span style="font-family: courier new,courier; font-size: x-small;">exception was thrown in a call to a WSDL export extension: System.ServiceModel.Description.DataContractSerializerOperationBehavior</span><br /><span style="font-family: courier new,courier; font-size: x-small;">contract: <a href="https://tempuri.org/:IService1%3c/Message%3e%3cStackTrace">https://tempuri.org/:IService1&lt;/Message&gt;&lt;StackTrace</a>&gt;&nbsp;&nbsp; at</span><br /><span style="font-family: courier new,courier; font-size: x-small;">System.ServiceModel.Description.ServiceMetadataBehavior.MetadataExtensionInitializer.GenerateMetadata()&nbsp;&nbsp; at</span><br /><span style="font-family: courier new,courier; font-size: x-small;">System.ServiceModel.Description.ServiceMetadataExtension.EnsureInitialized()&nbsp;&nbsp; at</span><br /><span style="font-family: courier new,courier; font-size: x-small;">System.ServiceModel.Description.ServiceMetadataExtension.WSMexImpl.GatherMetadata(String</span><br /><span style="font-family: courier new,courier; font-size: x-small;">dialect, String identifier)&nbsp;&nbsp; at</span><br /><span style="font-family: courier new,courier; font-size: x-small;">System.ServiceModel.Description.ServiceMetadataExtension.WSMexImpl.Get(Message</span><br /><span style="font-family: courier new,courier; font-size: x-small;">request)&nbsp;&nbsp; at SyncInvokeGet(Object ,</span><br /><span style="font-family: courier new,courier; font-size: x-small;">Object[] , Object[] )&nbsp;&nbsp; at</span><br /><span style="font-family: courier new,courier; font-size: x-small;">System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance,</span><br /><span style="font-family: courier new,courier; font-size: x-small;">Object[] inputs, Object[]&amp;amp; outputs)&nbsp;&nbsp;</span><br /><span style="font-family: courier new,courier; font-size: x-small;">at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp;amp;</span><br /><span style="font-family: courier new,courier; font-size: x-small;">rpc)&nbsp;&nbsp; at</span><br /><span style="font-family: courier new,courier; font-size: x-small;">System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp;amp;</span><br /><span style="font-family: courier new,courier; font-size: x-small;">rpc)&nbsp;&nbsp; at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&amp;amp;</span><br /><span style="font-family: courier new,courier; font-size: x-small;">rpc)&nbsp;&nbsp; at</span><br /><span style="font-family: courier new,courier; font-size: x-small;">System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean</span><br /><span style="font-family: courier new,courier; font-size: x-small;">isOperationContextSet)&lt;/StackTrace&gt;&lt;Type&gt;System.InvalidOperationException&lt;/Type&gt;&lt;/ExceptionDetail&gt;&lt;/Detail&gt;&lt;/Fault&gt;HTTP</span><br /><span style="font-family: courier new,courier; font-size: x-small;">GET Error&nbsp;&nbsp;&nbsp; URI: <a href="https://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/mex">https://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/mex</a>&nbsp;&nbsp;&nbsp; There was an error downloading</span><br /><span style="font-family: courier new,courier; font-size: x-small;">'https://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/mex'.&nbsp;&nbsp;&nbsp; The request failed with HTTP status 400:</span><br /><span style="font-family: courier new,courier; font-size: x-small;">Bad Request.</span></p>]]></content:encoded>
    </item>
    <item>
      <title>SYSK 392: WebActivator Under The Hood post by Suhas Rao</title>
      <link>https://docs.microsoft.com/archive/blogs/irenak/sysk-392-webactivator-under-the-hood-post-by-suhas-rao</link>
      <pubDate>Mon, 01 Sep 2014 08:38:19 GMT</pubDate>
      <dc:creator><![CDATA[irenake]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/irenak/2014/09/01/sysk-392-webactivator-under-the-hood-post-by-suhas-rao/</guid>
      <description><![CDATA[Check out a good post by one of my coworkers --...]]></description>
      <content:encoded><![CDATA[<p>Check out a good post by one of my coworkers -- <a href="https://blogs.msdn.com/b/suhasaraos/archive/2014/08/13/webactivator-under-the-hood.aspx">https://blogs.msdn.com/b/suhasaraos/archive/2014/08/13/webactivator-under-the-hood.aspx</a></p>]]></content:encoded>
    </item>
    <item>
      <title>SYSK 391: Entities as a data contract</title>
      <link>https://docs.microsoft.com/archive/blogs/irenak/sysk-391-entities-as-a-data-contract</link>
      <pubDate>Sun, 20 Jul 2014 16:56:00 GMT</pubDate>
      <dc:creator><![CDATA[irenake]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/irenak/2014/07/20/sysk-391-entities-as-a-data-contract/</guid>
      <description><![CDATA[There may be instances when using data transfer objects (DTO) is appropriate. For example, if you...]]></description>
      <content:encoded><![CDATA[<p>There may be instances when using data transfer objects (DTO) is appropriate. For example, if you need to control the serialization details, such as which members to serialize and which not to serialize, and if you need to change the names of the serialized members, or do data contract mapping based on service version, or you want to suppress custom logic in entities created via partial classes, etc.&nbsp; If you choose to use DTOs, consider using generator classes, e.g. EntitiesToDTOs - Entity Framework DTO Generator available at <a href="https://visualstudiogallery.msdn.microsoft.com/655aa6d4-4461-42ea-aeec-64cdb1313de7">https://visualstudiogallery.msdn.microsoft.com/655aa6d4-4461-42ea-aeec-64cdb1313de7</a>, DTO from Entity Framework Class at <a href="https://www.codeproject.com/Tips/739566/DTO-from-Entity-Framework-class">https://www.codeproject.com/Tips/739566/DTO-from-Entity-Framework-class</a> or others.</p>
<p>On my current project, however, there were no requirements that would direct us the DTO route, and since Entity Framework automatically creates a data contract for entities in your EDMX model, I was hoping to use the T4 generated classes as is.&nbsp; However, there were two problems:</p>
<ol>
<li>Using T4 generated entities as a contract in an asmx service would result in an error due to ICollection&lt;T&gt; used for 1-&gt;M navigation properties (e.g. Person -&gt; Phones)</li>
<li>Entity Framework uses dynamic proxies for change tracking and lazy loading.&nbsp; When returning results of an operation to the caller, serialization of navigation properties that are not loaded will trigger lazy loading resulting in a runtime exception because the DbContext is already disposed.&nbsp;</li>
</ol>
<p><br />You can turn off generation of the proxies by setting dbContext.Configuration.ProxyCreationEnabled to False.&nbsp; However, you will lose the lazy loading functionality and will have to eagerly or explicitly load related objects.&nbsp;&nbsp; You will also lose change tracking which may be acceptable in a service Get operation because change tracking only works on entities attached to a context, and that&rsquo;s not the case once the data is returned to the caller of the service.</p>
<p>To deal with the aforementioned issues, you can modify the T4 template as demonstrated below.&nbsp; Most of the needed work will be accomplished by the code-generated classes.&nbsp; The only thing required to take advantage of this functionality is to call AsSerializable() upon returning results from your service, e.g.:</p>
<p><code class="csharp">public Person GetData(int id)<br /> {<br />&nbsp;&nbsp;&nbsp;&nbsp; Person result = null;<br /> <br />&nbsp;&nbsp;&nbsp;&nbsp; using (var ctx = new ModelEntities())<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = (from e in ctx.Person.Include("Phones") where e.PersonID == id select e).FirstOrDefault();<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br /> <br />&nbsp;&nbsp;&nbsp;&nbsp; return result<strong><span style="background-color: #ffff00;">.AsSerializable();</span></strong><br /> }&nbsp;<br /> </code></p>
<p>&nbsp;</p>
<p><strong>Model.tt file</strong> <br />Changes highlighted</p>
<p><span style="font-family: courier new,courier;">&lt;#@ template language="C#" debug="false" hostspecific="true"#&gt;</span><br /><span style="font-family: courier new,courier;">&lt;#@ include file="EF6.Utility.CS.ttinclude"#&gt;&lt;#@ </span><br /><span style="font-family: courier new,courier;">&nbsp;output extension=".cs"#&gt;&lt;#</span></p>
<p><span style="font-family: courier new,courier;">const string inputFile = @"..\DataAccess\Model1.edmx";</span><br /><span style="font-family: courier new,courier;">var textTransform = DynamicTextTransformation.Create(this);</span><br /><span style="font-family: courier new,courier;">var code = new CodeGenerationTools(this);</span><br /><span style="font-family: courier new,courier;">var ef = new MetadataTools(this);</span><br /><span style="font-family: courier new,courier;">var typeMapper = new TypeMapper(code, ef, textTransform.Errors);</span><br /><span style="font-family: courier new,courier;">var&nbsp;fileManager = EntityFrameworkTemplateFileManager.Create(this);</span><br /><span style="font-family: courier new,courier;">var itemCollection = new EdmMetadataLoader(textTransform.Host, textTransform.Errors).CreateEdmItemCollection(inputFile);</span><br /><span style="font-family: courier new,courier;">var codeStringGenerator = new CodeStringGenerator(code, typeMapper, ef);</span></p>
<p><span style="font-family: courier new,courier;">if (!typeMapper.VerifyCaseInsensitiveTypeUniqueness(typeMapper.GetAllGlobalItems(itemCollection), inputFile))</span><br /><span style="font-family: courier new,courier;">{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; return string.Empty;</span><br /><span style="font-family: courier new,courier;">}</span></p>
<p><span style="font-family: courier new,courier;">WriteHeader(codeStringGenerator, fileManager);</span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">fileManager.StartNewFile("Serializable.cs");</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">BeginNamespace(code);</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">SerializableObject();</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">EndNamespace(code);</span></strong></span></p>
<p><span style="font-family: courier new,courier;">foreach (var entity in typeMapper.GetItemsToGenerate&lt;EntityType&gt;(itemCollection))</span><br /><span style="font-family: courier new,courier;">{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; fileManager.StartNewFile(entity.Name + ".cs");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; BeginNamespace(code);</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&lt;#=codeStringGenerator.UsingDirectives(inHeader: false)#&gt;</span><br /><span style="font-family: courier new,courier;">&lt;#=codeStringGenerator.EntityClassOpening(entity)#&gt;</span><br /><span style="font-family: courier new,courier;">{</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; var propertiesWithDefaultValues = typeMapper.GetPropertiesWithDefaultValues(entity);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; var collectionNavigationProperties = typeMapper.GetCollectionNavigationProperties(entity);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; var complexProperties = typeMapper.GetComplexProperties(entity);</span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; //if (propertiesWithDefaultValues.Any() || collectionNavigationProperties.Any() || complexProperties.Any())</span></strong></span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public &lt;#=code.Escape(entity)#&gt;()</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (var edmProperty in propertiesWithDefaultValues)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.&lt;#=code.Escape(edmProperty)#&gt; = &lt;#=typeMapper.CreateLiteral(edmProperty.DefaultValue)#&gt;;</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (var navigationProperty in collectionNavigationProperties)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;this.&lt;#=code.Escape(navigationProperty)#&gt; = new <span style="background-color: #ffff00;"><strong>List</strong></span>&lt;&lt;#=typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType())#&gt;&gt;();</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (var complexProperty in complexProperties)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.&lt;#=code.Escape(complexProperty)#&gt; = new &lt;#=typeMapper.GetTypeName(complexProperty.TypeUsage)#&gt;();</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;private &lt;#=code.Escape(entity)#&gt;(&lt;#=code.Escape(entity)#&gt; obj) : base(obj, null) { }</span><br /><span style="font-family: courier new,courier;">&nbsp;private &lt;#=code.Escape(entity)#&gt;(&lt;#=code.Escape(entity)#&gt; obj, Dictionary&lt;Type, object&gt; createdTypes) : base(obj, createdTypes) { }</span><br /><span style="font-family: courier new,courier;">&lt;#&nbsp;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; var simpleProperties = typeMapper.GetSimpleProperties(entity);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; if (simpleProperties.Any())</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (var edmProperty in simpleProperties)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; &lt;#=codeStringGenerator.Property(edmProperty)#&gt;</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; if (complexProperties.Any())</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">#&gt;</span></p>
<p><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach(var complexProperty in complexProperties)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; &lt;#=codeStringGenerator.Property(complexProperty)#&gt;</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; var navigationProperties = typeMapper.GetNavigationProperties(entity);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; if (navigationProperties.Any())</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">#&gt;</span></p>
<p><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (var navigationProperty in navigationProperties)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; &lt;#=codeStringGenerator.NavigationProperty(navigationProperty)#&gt;</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">}</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; EndNamespace(code);</span><br /><span style="font-family: courier new,courier;">}</span></p>
<p><span style="font-family: courier new,courier;">foreach (var complex in typeMapper.GetItemsToGenerate&lt;ComplexType&gt;(itemCollection))</span><br /><span style="font-family: courier new,courier;">{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; fileManager.StartNewFile(complex.Name + ".cs");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; BeginNamespace(code);</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&lt;#=codeStringGenerator.UsingDirectives(inHeader: false, includeCollections: false)#&gt;</span><br /><span style="font-family: courier new,courier;">&lt;#=Accessibility.ForType(complex)#&gt; partial class &lt;#=code.Escape(complex)#&gt; &nbsp;</span><br /><span style="font-family: courier new,courier;">{</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; var complexProperties = typeMapper.GetComplexProperties(complex);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; var propertiesWithDefaultValues = typeMapper.GetPropertiesWithDefaultValues(complex);</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; if (propertiesWithDefaultValues.Any() || complexProperties.Any())</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public &lt;#=code.Escape(complex)#&gt;()</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (var edmProperty in propertiesWithDefaultValues)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.&lt;#=code.Escape(edmProperty)#&gt; = &lt;#=typeMapper.CreateLiteral(edmProperty.DefaultValue)#&gt;;</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (var complexProperty in complexProperties)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.&lt;#=code.Escape(complexProperty)#&gt; = new &lt;#=typeMapper.GetTypeName(complexProperty.TypeUsage)#&gt;();</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; var simpleProperties = typeMapper.GetSimpleProperties(complex);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; if (simpleProperties.Any())</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach(var edmProperty in simpleProperties)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; &lt;#=codeStringGenerator.Property(edmProperty)#&gt;</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; if (complexProperties.Any())</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">#&gt;</span></p>
<p><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach(var edmProperty in complexProperties)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; &lt;#=codeStringGenerator.Property(edmProperty)#&gt;</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">}</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; EndNamespace(code);</span><br /><span style="font-family: courier new,courier;">}</span></p>
<p><span style="font-family: courier new,courier;">foreach (var enumType in typeMapper.GetEnumItemsToGenerate(itemCollection))</span><br /><span style="font-family: courier new,courier;">{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; fileManager.StartNewFile(enumType.Name + ".cs");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; BeginNamespace(code);</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&lt;#=codeStringGenerator.UsingDirectives(inHeader: false, includeCollections: false)#&gt;</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; if (typeMapper.EnumIsFlags(enumType))</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">[Flags]</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&lt;#=codeStringGenerator.EnumOpening(enumType)#&gt;</span><br /><span style="font-family: courier new,courier;">{</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; var foundOne = false;</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; foreach (MetadataItem member in typeMapper.GetEnumMembers(enumType))</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foundOne = true;</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; &lt;#=code.Escape(typeMapper.GetEnumMemberName(member))#&gt; = &lt;#=typeMapper.GetEnumMemberValue(member)#&gt;,</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; if (foundOne)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.GenerationEnvironment.Remove(this.GenerationEnvironment.Length - 3, 1);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">}</span><br /><span style="font-family: courier new,courier;">&lt;#</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; EndNamespace(code);</span><br /><span style="font-family: courier new,courier;">}</span></p>
<p><span style="font-family: courier new,courier;">fileManager.Process();</span></p>
<p><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">&lt;#+</span></p>
<p><span style="font-family: courier new,courier;">public void WriteHeader(CodeStringGenerator codeStringGenerator, EntityFrameworkTemplateFileManager fileManager)</span><br /><span style="font-family: courier new,courier;">{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; fileManager.StartHeader();</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">//------------------------------------------------------------------------------</span><br /><span style="font-family: courier new,courier;">// &lt;auto-generated&gt;</span><br /><span style="font-family: courier new,courier;">// &lt;#=CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine1")#&gt;</span><br /><span style="font-family: courier new,courier;">//</span><br /><span style="font-family: courier new,courier;">// &lt;#=CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine2")#&gt;</span><br /><span style="font-family: courier new,courier;">// &lt;#=CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine3")#&gt;</span><br /><span style="font-family: courier new,courier;">// &lt;/auto-generated&gt;</span><br /><span style="font-family: courier new,courier;">//------------------------------------------------------------------------------</span><br /><span style="font-family: courier new,courier;">&lt;#=codeStringGenerator.UsingDirectives(inHeader: true)#&gt;</span><br /><span style="font-family: courier new,courier;">&lt;#+</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; fileManager.EndBlock();</span><br /><span style="font-family: courier new,courier;">}</span></p>
<p><span style="font-family: courier new,courier;">public void BeginNamespace(CodeGenerationTools code)</span><br /><span style="font-family: courier new,courier;">{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; var codeNamespace = code.VsNamespaceSuggestion();</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; if (!String.IsNullOrEmpty(codeNamespace))</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">namespace &lt;#=code.EscapeNamespace(codeNamespace)#&gt;</span><br /><span style="font-family: courier new,courier;">{</span><br /><span style="font-family: courier new,courier;">&lt;#+</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PushIndent("&nbsp;&nbsp;&nbsp; ");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">}</span></p>
<p><span style="font-family: courier new,courier;">public void EndNamespace(CodeGenerationTools code)</span><br /><span style="font-family: courier new,courier;">{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; if (!String.IsNullOrEmpty(code.VsNamespaceSuggestion()))</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PopIndent();</span><br /><span style="font-family: courier new,courier;">#&gt;</span><br /><span style="font-family: courier new,courier;">}</span><br /><span style="font-family: courier new,courier;">&lt;#+</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">}</span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">public void SerializableObject()</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">{</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">#&gt;</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">using System;</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">using System.Collections;</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">using System.Collections.Generic;</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">using System.Reflection;</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">using System.Runtime.Serialization;</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">[DataContract] </span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">public abstract class SerializableObject&lt;T&gt; where T : class</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">{</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; [NonSerialized]</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; private Dictionary&lt;Type, object&gt; CreatedTypes = null;</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; [DataMember]</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public T OriginalValues { get; private set; }</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public T AsSerializable()</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;T origValues = CreateInstance(typeof(T), new object[] { this }) as T;</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;(origValues as SerializableObject&lt;T&gt;).OriginalValues = null;</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;T result = CreateInstance(typeof(T), new object[] { this }) as T;</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;(result as SerializableObject&lt;T&gt;).OriginalValues = origValues;</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;return result;</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public SerializableObject() { }</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; protected SerializableObject(T o, Dictionary&lt;Type, object&gt; createdTypes)</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.CreatedTypes = createdTypes == null ? new Dictionary&lt;Type, object&gt;() : createdTypes;</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (createdTypes == null)</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.CreatedTypes.Add(this.GetType(), this);</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (var f in this.GetType().GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance))</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Diagnostics.Debug.WriteLine(f.Name);</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; object fv = f.GetValue(o);</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fv != null &amp;&amp; fv.GetType().IsGenericType)</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type t = fv.GetType().GetGenericTypeDefinition();</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type fieldType = t.MakeGenericType(fv.GetType().GenericTypeArguments);</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IList items = null;</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fv is IEnumerable)</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type itemType = null;</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type itemsType = typeof(List&lt;&gt;).GetGenericTypeDefinition();</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (var i in fv as IEnumerable)</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (itemType == null)</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO: Remove reliance on the string EntityProxyModule</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i.GetType().Module.ScopeName == "EntityProxyModule")</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; itemType = i.GetType().BaseType;</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; itemType = i.GetType();</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; items = Activator.CreateInstance(itemsType.MakeGenericType(itemType)) as IList;</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; object item = CreateInstance(itemType, new object[] { i });</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; items.Add(item);</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dynamic v = CreateInstance(fieldType, new object[] { items });</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.SetValue(this, v);</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.SetValue(this, CreateInstance(fieldType, new object[] { fv }));</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fv != null)</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO: Remove reliance on the string EntityProxyModule</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fv.GetType().Module.ScopeName == "EntityProxyModule")</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fv = CreateInstance(fv.GetType().BaseType, new object[] { fv }, true);</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.SetValue(this, fv);</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; private object CreateInstance(Type t, object[] args, bool cache = false)</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; object result = null;</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.CreatedTypes != null &amp;&amp; this.CreatedTypes.ContainsKey(t))</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Return null to avoid circular references leading to runtime exceptions like</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; An exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in System.Core.dll but was not handled in user code</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Additional information: The best overloaded method match for 'System.Collections.Generic.HashSet&lt;ClassLibrary2.Phone&gt;.Add(ClassLibrary2.Phone)' has some invalid arguments</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at CallSite.Target(Closure , CallSite , Object , Object )</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid2[T0,T1](CallSite site, T0 arg0, T1 arg1)</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at ClassLibrary2.SerializableObject`1..ctor(T o, Dictionary`2 createdTypes) in c:\Temp\xx\ClassLibrary2\Class1.cs:line 60</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at ClassLibrary2.SerializableObject`1..ctor(T o) in c:\Temp\xx\ClassLibrary2\Class1.cs:line 20</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at ClassLibrary2.Employee..ctor(Employee e) in c:\Temp\xx\ClassLibrary2\Class1.cs:line 122</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at WcfServiceLibrary1.Service1.GetData(Int32 value) in c:\Temp\xx\WcfServiceLibrary1\Service1.cs:line 24</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at SyncInvokeGetData(Object , Object[] , Object[] )</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs)</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // result = this.CreatedTypes[t];</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = null;</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type gt = typeof(SerializableObject&lt;&gt;).GetGenericTypeDefinition();</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (t.IsSubclassOf(gt.MakeGenericType(t)))</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;object&gt; newArgs = new List&lt;object&gt;();</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newArgs.AddRange(args);</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newArgs.Add(this.CreatedTypes);</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var ctor = t.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null,</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Type[] { t, typeof(Dictionary&lt;Type, object&gt;) }, null);</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Diagnostics.Debug.Assert(ctor != null);</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = ctor.Invoke(newArgs.ToArray());</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (args[0] == null)</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = Activator.CreateInstance(t);</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = Activator.CreateInstance(t, args);</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cache)</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.CreatedTypes.Add(t, result);</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;}</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">}</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&lt;#+</span></strong></span></p>
<p><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">}</span></strong></span></p>
<p><span style="font-family: courier new,courier;">public const string TemplateId = "CSharp_DbContext_Types_EF6";</span></p>
<p><span style="font-family: courier new,courier;">public class CodeStringGenerator</span><br /><span style="font-family: courier new,courier;">{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; private readonly CodeGenerationTools _code;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; private readonly TypeMapper _typeMapper;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; private readonly MetadataTools _ef;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public CodeStringGenerator(CodeGenerationTools code, TypeMapper typeMapper, MetadataTools ef)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArgumentNotNull(code, "code");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArgumentNotNull(typeMapper, "typeMapper");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArgumentNotNull(ef, "ef");</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code = code;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _typeMapper = typeMapper;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ef = ef;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string Property(EdmProperty edmProperty)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return string.Format(</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CultureInfo.InvariantCulture,</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "{0} {1} {2} {{ {3}get; {4}set; }}",</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Accessibility.ForProperty(edmProperty),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _typeMapper.GetTypeName(edmProperty.TypeUsage),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code.Escape(edmProperty),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code.SpaceAfter(Accessibility.ForGetter(edmProperty)),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code.SpaceAfter(Accessibility.ForSetter(edmProperty)));</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string NavigationProperty(NavigationProperty navProp)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var endType = _typeMapper.GetTypeName(navProp.ToEndMember.GetEntityType());</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return string.Format(</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CultureInfo.InvariantCulture,</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "{0} {1} {2} {{ {3}get; {4}set; }}",</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AccessibilityAndVirtual(Accessibility.ForNavigationProperty(navProp)),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;navProp.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("<span style="background-color: #ffff00;"><strong>List</strong></span>&lt;" + endType + "&gt;") : endType,</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code.Escape(navProp),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code.SpaceAfter(Accessibility.ForGetter(navProp)),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code.SpaceAfter(Accessibility.ForSetter(navProp)));</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string AccessibilityAndVirtual(string accessibility)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return accessibility + (accessibility != "private" ? " virtual" : "");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string EntityClassOpening(EntityType entity)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;var baseType = entity.BaseType != null ? _typeMapper.GetTypeName(entity.BaseType)</span></strong></span><br /><span style="background-color: #ffff00;"><strong><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;: "SerializableObject&lt;" +&nbsp; _code.Escape(entity) + "&gt;";</span></strong></span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return string.Format(</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CultureInfo.InvariantCulture,</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "{0} {1}partial class {2}{3}",</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Accessibility.ForType(entity),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code.SpaceAfter(_code.AbstractOption(entity)),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code.Escape(entity),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code.StringBefore(" : ", <span style="background-color: #ffff00;"><strong>baseType</strong></span> ));</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string EnumOpening(SimpleType enumType)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return string.Format(</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CultureInfo.InvariantCulture,</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "{0} enum {1} : {2}",</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Accessibility.ForType(enumType),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code.Escape(enumType),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code.Escape(_typeMapper.UnderlyingClrType(enumType)));</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public void WriteFunctionParameters(EdmFunction edmFunction, Action&lt;string, string, string, string&gt; writeParameter)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var parameters = FunctionImportParameter.Create(edmFunction.Parameters, _code, _ef);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (var parameter in parameters.Where(p =&gt; p.NeedsLocalVariable))</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var isNotNull = parameter.IsNullableOfT ? parameter.FunctionParameterName + ".HasValue" : parameter.FunctionParameterName + " != null";</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var notNullInit = "new ObjectParameter(\"" + parameter.EsqlParameterName + "\", " + parameter.FunctionParameterName + ")";</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var nullInit = "new ObjectParameter(\"" + parameter.EsqlParameterName + "\", typeof(" + TypeMapper.FixNamespaces(parameter.RawClrTypeName) + "))";</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writeParameter(parameter.LocalVariableName, isNotNull, notNullInit, nullInit);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string ComposableFunctionMethod(EdmFunction edmFunction, string modelNamespace)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var parameters = _typeMapper.GetParameters(edmFunction);</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return string.Format(</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CultureInfo.InvariantCulture,</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "{0} IQueryable&lt;{1}&gt; {2}({3})",</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AccessibilityAndVirtual(Accessibility.ForMethod(edmFunction)),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _typeMapper.GetTypeName(_typeMapper.GetReturnType(edmFunction), modelNamespace),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code.Escape(edmFunction),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string.Join(", ", parameters.Select(p =&gt; TypeMapper.FixNamespaces(p.FunctionParameterType) + " " + p.FunctionParameterName).ToArray()));</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string ComposableCreateQuery(EdmFunction edmFunction, string modelNamespace)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var parameters = _typeMapper.GetParameters(edmFunction);</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return string.Format(</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CultureInfo.InvariantCulture,</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "return ((IObjectContextAdapter)this).ObjectContext.CreateQuery&lt;{0}&gt;(\"[{1}].[{2}]({3})\"{4});",</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _typeMapper.GetTypeName(_typeMapper.GetReturnType(edmFunction), modelNamespace),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edmFunction.NamespaceName,</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edmFunction.Name,</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string.Join(", ", parameters.Select(p =&gt; "@" + p.EsqlParameterName).ToArray()),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code.StringBefore(", ", string.Join(", ", parameters.Select(p =&gt; p.ExecuteParameterName).ToArray())));</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string FunctionMethod(EdmFunction edmFunction, string modelNamespace, bool includeMergeOption)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var parameters = _typeMapper.GetParameters(edmFunction);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var returnType = _typeMapper.GetReturnType(edmFunction);</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var paramList = String.Join(", ", parameters.Select(p =&gt; TypeMapper.FixNamespaces(p.FunctionParameterType) + " " + p.FunctionParameterName).ToArray());</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (includeMergeOption)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paramList = _code.StringAfter(paramList, ", ") + "MergeOption mergeOption";</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return string.Format(</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CultureInfo.InvariantCulture,</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "{0} {1} {2}({3})",</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AccessibilityAndVirtual(Accessibility.ForMethod(edmFunction)),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnType == null ? "int" : "ObjectResult&lt;" + _typeMapper.GetTypeName(returnType, modelNamespace) + "&gt;",</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code.Escape(edmFunction),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paramList);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string ExecuteFunction(EdmFunction edmFunction, string modelNamespace, bool includeMergeOption)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var parameters = _typeMapper.GetParameters(edmFunction);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var returnType = _typeMapper.GetReturnType(edmFunction);</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var callParams = _code.StringBefore(", ", String.Join(", ", parameters.Select(p =&gt; p.ExecuteParameterName).ToArray()));</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (includeMergeOption)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callParams = ", mergeOption" + callParams;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return string.Format(</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CultureInfo.InvariantCulture,</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction{0}(\"{1}\"{2});",</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnType == null ? "" : "&lt;" + _typeMapper.GetTypeName(returnType, modelNamespace) + "&gt;",</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edmFunction.Name,</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callParams);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string DbSet(EntitySet entitySet)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return string.Format(</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CultureInfo.InvariantCulture,</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "{0} virtual DbSet&lt;{1}&gt; {2} {{ get; set; }}",</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Accessibility.ForReadOnlyProperty(entitySet),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _typeMapper.GetTypeName(entitySet.ElementType),</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code.Escape(entitySet));</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string UsingDirectives(bool inHeader, bool includeCollections = true)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion())</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ? string.Format(</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CultureInfo.InvariantCulture,</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "{0}using System;{1}" +</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "{2}",</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inHeader ? Environment.NewLine : "",</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "",</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inHeader ? "" : Environment.NewLine)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "";</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }&nbsp;</span></p>
<p><span style="font-family: courier new,courier;">}</span></p>
<p><span style="font-family: courier new,courier;">public class TypeMapper</span><br /><span style="font-family: courier new,courier;">{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; private const string ExternalTypeNameAttributeName = @"<a href="https://schemas.microsoft.com/ado/2006/04/codegeneration:ExternalTypeName">https://schemas.microsoft.com/ado/2006/04/codegeneration:ExternalTypeName</a>";</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; private readonly System.Collections.IList _errors;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; private readonly CodeGenerationTools _code;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; private readonly MetadataTools _ef;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public TypeMapper(CodeGenerationTools code, MetadataTools ef, System.Collections.IList errors)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArgumentNotNull(code, "code");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArgumentNotNull(ef, "ef");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArgumentNotNull(errors, "errors");</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code = code;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ef = ef;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _errors = errors;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public static string FixNamespaces(string typeName)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return typeName.Replace("System.Data.Spatial.", "System.Data.Entity.Spatial.");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string GetTypeName(TypeUsage typeUsage)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return typeUsage == null ? null : GetTypeName(typeUsage.EdmType, _ef.IsNullable(typeUsage), modelNamespace: null);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string GetTypeName(EdmType edmType)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return GetTypeName(edmType, isNullable: null, modelNamespace: null);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string GetTypeName(TypeUsage typeUsage, string modelNamespace)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return typeUsage == null ? null : GetTypeName(typeUsage.EdmType, _ef.IsNullable(typeUsage), modelNamespace);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string GetTypeName(EdmType edmType, string modelNamespace)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return GetTypeName(edmType, isNullable: null, modelNamespace: modelNamespace);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string GetTypeName(EdmType edmType, bool? isNullable, string modelNamespace)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (edmType == null)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var collectionType = edmType as CollectionType;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (collectionType != null)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return String.Format(CultureInfo.InvariantCulture, "<span style="background-color: #ffff00;"><strong>List</strong></span>&lt;{0}&gt;", GetTypeName(collectionType.TypeUsage, modelNamespace));</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var typeName = _code.Escape(edmType.MetadataProperties</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Where(p =&gt; p.Name == ExternalTypeNameAttributeName)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Select(p =&gt; (string)p.Value)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .FirstOrDefault())</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?? (modelNamespace != null &amp;&amp; edmType.NamespaceName != modelNamespace ?</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code.CreateFullName(_code.EscapeNamespace(edmType.NamespaceName), _code.Escape(edmType)) :</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code.Escape(edmType));</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (edmType is StructuralType)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return typeName;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (edmType is SimpleType)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var clrType = UnderlyingClrType(edmType);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!IsEnumType(edmType))</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typeName = _code.Escape(clrType);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typeName = FixNamespaces(typeName);</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return clrType.IsValueType &amp;&amp; isNullable == true ?</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String.Format(CultureInfo.InvariantCulture, "Nullable&lt;{0}&gt;", typeName) :</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typeName;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new ArgumentException("edmType");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public Type UnderlyingClrType(EdmType edmType)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArgumentNotNull(edmType, "edmType");</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var primitiveType = edmType as PrimitiveType;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (primitiveType != null)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return primitiveType.ClrEquivalentType;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (IsEnumType(edmType))</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return GetEnumUnderlyingType(edmType).ClrEquivalentType;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return typeof(object);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public object GetEnumMemberValue(MetadataItem enumMember)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArgumentNotNull(enumMember, "enumMember");</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var valueProperty = enumMember.GetType().GetProperty("Value");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return valueProperty == null ? null : valueProperty.GetValue(enumMember, null);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string GetEnumMemberName(MetadataItem enumMember)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArgumentNotNull(enumMember, "enumMember");</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var nameProperty = enumMember.GetType().GetProperty("Name");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return nameProperty == null ? null : (string)nameProperty.GetValue(enumMember, null);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public System.Collections.IEnumerable GetEnumMembers(EdmType enumType)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArgumentNotNull(enumType, "enumType");</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var membersProperty = enumType.GetType().GetProperty("Members");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return membersProperty != null </span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ? (System.Collections.IEnumerable)membersProperty.GetValue(enumType, null)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Enumerable.Empty&lt;MetadataItem&gt;();</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public bool EnumIsFlags(EdmType enumType)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArgumentNotNull(enumType, "enumType");</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var isFlagsProperty = enumType.GetType().GetProperty("IsFlags");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return isFlagsProperty != null &amp;&amp; (bool)isFlagsProperty.GetValue(enumType, null);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public bool IsEnumType(GlobalItem edmType)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArgumentNotNull(edmType, "edmType");</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return edmType.GetType().Name == "EnumType";</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public PrimitiveType GetEnumUnderlyingType(EdmType enumType)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArgumentNotNull(enumType, "enumType");</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (PrimitiveType)enumType.GetType().GetProperty("UnderlyingType").GetValue(enumType, null);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string CreateLiteral(object value)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (value == null || value.GetType() != typeof(TimeSpan))</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return _code.CreateLiteral(value);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return string.Format(CultureInfo.InvariantCulture, "new TimeSpan({0})", ((TimeSpan)value).Ticks);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public bool VerifyCaseInsensitiveTypeUniqueness(IEnumerable&lt;string&gt; types, string sourceFile)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArgumentNotNull(types, "types");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArgumentNotNull(sourceFile, "sourceFile");</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var hash = new HashSet&lt;string&gt;(StringComparer.InvariantCultureIgnoreCase);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (types.Any(item =&gt; !hash.Add(item)))</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _errors.Add(</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new CompilerError(sourceFile, -1, -1, "6023",</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_CaseInsensitiveTypeConflict"))));</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public IEnumerable&lt;SimpleType&gt; GetEnumItemsToGenerate(IEnumerable&lt;GlobalItem&gt; itemCollection)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return GetItemsToGenerate&lt;SimpleType&gt;(itemCollection)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Where(e =&gt; IsEnumType(e));</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public IEnumerable&lt;T&gt; GetItemsToGenerate&lt;T&gt;(IEnumerable&lt;GlobalItem&gt; itemCollection) where T: EdmType</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return itemCollection</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .OfType&lt;T&gt;()</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Where(i =&gt; !i.MetadataProperties.Any(p =&gt; p.Name == ExternalTypeNameAttributeName))</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .OrderBy(i =&gt; i.Name);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public IEnumerable&lt;string&gt; GetAllGlobalItems(IEnumerable&lt;GlobalItem&gt; itemCollection)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return itemCollection</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Where(i =&gt; i is EntityType || i is ComplexType || i is EntityContainer || IsEnumType(i))</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Select(g =&gt; GetGlobalItemName(g));</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public string GetGlobalItemName(GlobalItem item)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (item is EdmType)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ((EdmType)item).Name;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ((EntityContainer)item).Name;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public IEnumerable&lt;EdmProperty&gt; GetSimpleProperties(EntityType type)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return type.Properties.Where(p =&gt; p.TypeUsage.EdmType is SimpleType &amp;&amp; p.DeclaringType == type);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public IEnumerable&lt;EdmProperty&gt; GetSimpleProperties(ComplexType type)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return type.Properties.Where(p =&gt; p.TypeUsage.EdmType is SimpleType &amp;&amp; p.DeclaringType == type);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public IEnumerable&lt;EdmProperty&gt; GetComplexProperties(EntityType type)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return type.Properties.Where(p =&gt; p.TypeUsage.EdmType is ComplexType &amp;&amp; p.DeclaringType == type);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public IEnumerable&lt;EdmProperty&gt; GetComplexProperties(ComplexType type)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return type.Properties.Where(p =&gt; p.TypeUsage.EdmType is ComplexType &amp;&amp; p.DeclaringType == type);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public IEnumerable&lt;EdmProperty&gt; GetPropertiesWithDefaultValues(EntityType type)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return type.Properties.Where(p =&gt; p.TypeUsage.EdmType is SimpleType &amp;&amp; p.DeclaringType == type &amp;&amp; p.DefaultValue != null);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public IEnumerable&lt;EdmProperty&gt; GetPropertiesWithDefaultValues(ComplexType type)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return type.Properties.Where(p =&gt; p.TypeUsage.EdmType is SimpleType &amp;&amp; p.DeclaringType == type &amp;&amp; p.DefaultValue != null);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public IEnumerable&lt;NavigationProperty&gt; GetNavigationProperties(EntityType type)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return type.NavigationProperties.Where(np =&gt; np.DeclaringType == type);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public IEnumerable&lt;NavigationProperty&gt; GetCollectionNavigationProperties(EntityType type)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return type.NavigationProperties.Where(np =&gt; np.DeclaringType == type &amp;&amp; np.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public FunctionParameter GetReturnParameter(EdmFunction edmFunction)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArgumentNotNull(edmFunction, "edmFunction");</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var returnParamsProperty = edmFunction.GetType().GetProperty("ReturnParameters");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return returnParamsProperty == null</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ? edmFunction.ReturnParameter</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : ((IEnumerable&lt;FunctionParameter&gt;)returnParamsProperty.GetValue(edmFunction, null)).FirstOrDefault();</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public bool IsComposable(EdmFunction edmFunction)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArgumentNotNull(edmFunction, "edmFunction");</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var isComposableProperty = edmFunction.GetType().GetProperty("IsComposableAttribute");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return isComposableProperty != null &amp;&amp; (bool)isComposableProperty.GetValue(edmFunction, null);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public IEnumerable&lt;FunctionImportParameter&gt; GetParameters(EdmFunction edmFunction)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FunctionImportParameter.Create(edmFunction.Parameters, _code, _ef);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public TypeUsage GetReturnType(EdmFunction edmFunction)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var returnParam = GetReturnParameter(edmFunction);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return returnParam == null ? null : _ef.GetElementType(returnParam.TypeUsage);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public bool GenerateMergeOptionFunction(EdmFunction edmFunction, bool includeMergeOption)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var returnType = GetReturnType(edmFunction);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return !includeMergeOption &amp;&amp; returnType != null &amp;&amp; returnType.EdmType.BuiltInTypeKind == BuiltInTypeKind.EntityType;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">}</span></p>
<p><span style="font-family: courier new,courier;">public static void ArgumentNotNull&lt;T&gt;(T arg, string name) where T : class</span><br /><span style="font-family: courier new,courier;">{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; if (arg == null)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new ArgumentNullException(name);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">}</span><br /><span style="font-family: courier new,courier;">#&gt;</span></p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>SYSK 390: String.Format vs. concatenation</title>
      <link>https://docs.microsoft.com/archive/blogs/irenak/sysk-390-string-format-vs-concatenation</link>
      <pubDate>Sun, 06 Jul 2014 10:39:41 GMT</pubDate>
      <dc:creator><![CDATA[irenake]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/irenak/2014/07/06/sysk-390-string-format-vs-concatenation/</guid>
      <description><![CDATA[Since .NET 1.0, we&rsquo;ve all been told &ndash; strings are immutable, so for best performance,...]]></description>
      <content:encoded><![CDATA[<p>Since .NET 1.0, we&rsquo;ve all been told &ndash; strings are immutable, so for best performance, avoid large number of string concatenation and use StringBuilder.&nbsp; Ok, but how large is &ldquo;large&rdquo; and what about string.Format?<br />If you use your favorite .NET de-compiler, you&rsquo;ll see that string.Format does quite a bit of work, and it would be logical to expect to pay, in terms of resource utilization, for that work.&nbsp; And, how bad is really string concatenation &ndash; for example, if I just need to put together an address from its parts into one string, should I use StringBuilder?<br />Here are some numbers from some tests on my laptop:<br />-&nbsp;Doing string concatenation (e.g. result +=x) doesn&rsquo;t appear to be a problem until I deal with over 10,000 strings.&nbsp; Then the performance gets significantly worse:</p>
<p><span style="font-family: courier new,courier;">Number of </span><br /><span style="font-family: courier new,courier;">concatenations&nbsp;Time taken in ms</span><br /><span style="font-family: courier new,courier;">-------------------------------------------</span><br /><span style="font-family: courier new,courier;">2,000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2</span><br /><span style="font-family: courier new,courier;">5,000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12</span><br /><span style="font-family: courier new,courier;">10,000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 46</span><br /><span style="font-family: courier new,courier;">100,000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14,631</span></p>
<p>-&nbsp;Getting data elements from an array results in about the same performance in small numbers (up to 10,000), but at 100,000, the performance is almost 70% slower</p>
<p>-&nbsp;Doing 10,000 concatenations with string.Format with a format string taking 1,000 elements at a time (adding a loop to execute logic 10 time, so we end up with 10,000 concatenations) takes 18 ms (compare to 46 when doing appending one string at a time via traditional += type of concatenation)</p>
<p>-&nbsp;When Format string is only 100 elements and looping 100 times, the time taken for 10,000 concatenations drops down to under 3 ms.</p>
<p>The performance numbers change slightly, but the ratio stays about the same when I add GC.Collect call.<br />Ok, so that&rsquo;s for large number of strings&hellip;&nbsp; What about just a few concatenations, like putting together an address from its parts?<br />Running Concat function vs. Format function below 10,000 times resulted in roughly the same performance &ndash; about 3-4 ms total time taken.&nbsp;&nbsp; Increasing the loop count to 10,000,000 resulted in 2,831 for 6 string concatenated via Concat function vs. 3,380 ms for same number of concatenations via Format.<br />Interestingly, when concatenating only two or three strings (e.g. person&rsquo;s first and last name), the concatenation took almost 3 times less time than using the Format function -- 546 ms for 10,000,000 concatenations of 2 strings with Concat vs. 1501 via Format.<br /><span style="font-family: courier new,courier;">private static string Concat(string s1, string s2, string s3, string s4, string s5, string s6)</span><br /><span style="font-family: courier new,courier;">{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; return s1 + "\r\n" + s2 + "\r\n" +s3 + "\r\n" + s4 + ", " + s5 + " " + s6;</span><br /><span style="font-family: courier new,courier;">}</span><br /><span style="font-family: courier new,courier;">private static string Format(string s1, string s2, string s3, string s4, string s5, string s6)</span><br /><span style="font-family: courier new,courier;">{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; return string.Format("{0}\r\n{1}\r\n{2}\r\n{3}, {4} {5}", s1, s2, s3, s4, s5, s6);</span><br /><span style="font-family: courier new,courier;">}</span></p>
<p><strong>So, what&rsquo;s the significance of all of this?&nbsp;</strong> In my opinion, when putting together small number of strings, e.g. person&rsquo;s name, address, etc., even if you&rsquo;re dealing with dozens and a few hundred strings, from performance point of view, the difference is negligible.&nbsp; I used to favor string.Format because of the type conversion, but it you have a mismatch between the number of arguments in the format string&rsquo;s and those passed in, you&rsquo;ll end up with a runtime error. Nowadays, the framework properly handle concatenating a number, a string and a null, e.g. <br /><span style="font-family: courier new,courier;">int number = 5;</span><br /><span style="font-family: courier new,courier;">string nullString = null;</span><br /><span style="font-family: courier new,courier;">string result = number + nullString + "abc";</span></p>
<p>will give you "5abc".&nbsp;&nbsp; So, string concatenations (in reasonable numbers) don&rsquo;t appear to be such an evil&hellip;&nbsp; However, with large number of concatenations you should evaluate your case and consider whether the performance hit, as well as the CPU utilization, warrant a different way of handing your data.</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>SYSK 389: How to set ClientCredentials via Configuration file in Client</title>
      <link>https://docs.microsoft.com/archive/blogs/irenak/sysk-389-how-to-set-clientcredentials-via-configuration-file-in-client</link>
      <pubDate>Sun, 30 Sep 2012 16:20:47 GMT</pubDate>
      <dc:creator><![CDATA[irenake]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/irenak/2012/09/30/sysk-389-how-to-set-clientcredentials-via-configuration-file-in-client/</guid>
      <description><![CDATA[I&rsquo;m working on a project where a service hosted elsewhere requires Windows...]]></description>
      <content:encoded><![CDATA[<p><span style="font-size: small;" size="2"><span style="font-family: Verdana;" face="Verdana">I&rsquo;m working on a project where a service hosted elsewhere requires Windows authentication.&nbsp; As a consultant, my computer is not on the customer&rsquo;s domain, so, using my logged-on Windows credentials won&rsquo;t do any good.&nbsp; And, doing nothing results in the following exception<b>:&nbsp; &ldquo;The caller was not authenticated by the service.&rdquo;</b> and inner exception is <b>&ldquo;The request for security token could not be satisfied because authentication failed.&rdquo;</b></span></span></p>
<p><span style="font-family: Verdana; font-size: small;" face="Verdana" size="2">&nbsp;</span></p>
<p><span style="font-size: small;" size="2"><span style="font-family: Verdana;" face="Verdana">To make this work, I need to create instance of NetworkCredential class and pass it on through the client proxy prior to making any calls to the service, e.g.</span></span></p>
<p><span style="font-family: courier new,courier;"><span style="font-size: x-small;">(</span>(System.ServiceModel.ClientBase&lt;YourNamesapce.IYourService&gt;)(client)).ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential("login", "password", "domain");</span></p>
<p><span style="font-family: Verdana; font-size: x-small;" face="Verdana" size="2">&nbsp;</span></p>
<p><span style="font-size: small;" size="2"><span style="font-family: Verdana;" face="Verdana">Since the project is going to be used by domain users, and the situation described above won&rsquo;t be an issue, I&rsquo;m one of the few consultants that have to deal with this, and, of course, putting the line above in the code is not an option.&nbsp; As an alternative, and, in my opinion, a more elegant solution, I wrote custom endpoint behavior, so, the only two things I need to do now is:</span></span></p>
<ol>
<li><span style="font-size: small;">&nbsp;<span size="2"><span style="font-family: Verdana;" face="Verdana">Make sure my WCF custom behavior assembly is in the bin file of the client</span></span></span></li>
<li><span style="font-size: small;">&nbsp;<span size="2"><span style="font-family: Verdana;" face="Verdana">Update client side configuration file as follows:</span></span></span></li>
</ol>
<p><span style="font-size: small;"><span style="font-family: Verdana;" face="Verdana" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a)</span>&nbsp;&nbsp;&nbsp; <span size="2"><span style="font-family: Verdana;" face="Verdana">&nbsp;Add behaviorExtension element</span></span></span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; &lt;extensions&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;behaviorExtensions&gt;</span></p>
<p><span style="font-family: courier new,courier; background-color: #ffff99;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add name="windowsClientCredentials" type="WCFExtensions.WindowsClientCredentialsConfig, WCFExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/behaviorExtensions&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; &lt;/extensions&gt;</span></p>
<p><span style="font-size: small;"><span style="font-family: Verdana;" face="Verdana" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b). Add </span>windowsClientCredentials <span size="2"><span style="font-family: Verdana;" face="Verdana">element to the behavior used by the endpoint, e.g. </span></span></span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; &lt;behaviors&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;endpointBehaviors&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;behavior name="NewBehavior0"&gt;</span></p>
<p><span style="font-family: courier new,courier; background-color: #ffff99;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;windowsClientCredentials user="x" password="y" domain="z" /&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/behavior&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/endpointBehaviors&gt;</span></p>
<p><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; &lt;/behaviors&gt;</span></p>
<p>&nbsp;</p>
<p><span style="font-size: small;" size="2"><span style="font-family: Verdana;" face="Verdana"><b><span style="text-decoration: underline;">NOTE</span></b><b>:&nbsp; I have not added encryption of the credentials in the config file.&nbsp; If you choose to use it in an enterprise application, I strongly suggest you secure the login settings.</b></span></span></p>
<p><span style="font-size: small;"><b><span style="font-family: Verdana;" face="Verdana" size="2"></span></b></span></p>
<p><span style="font-size: small;" size="2"><span style="font-family: Verdana;" face="Verdana">Below is the code for the custom behavior endpoint (just create a Windows class library project, add a class with the code below and compile.</span></span></p>
<p><span style="font-family: Verdana; font-size: small;" face="Verdana" size="2">&nbsp;</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">using System;</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">using System.Configuration;</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">using System.Linq;</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">using System.ServiceModel.Configuration;</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">using System.ServiceModel.Description;</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">using System.ServiceModel.Dispatcher;</span></p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">namespace WCFExtensions</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">{</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public class WindowsClientCredentialsConfig : BehaviorExtensionElement</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected override object CreateBehavior()</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new WindowsClientCredentialsBehavior(this.User, this.Password, this.Domain);</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public override Type BehaviorType</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return typeof(WindowsClientCredentialsBehavior); }</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ConfigurationProperty("user", IsRequired = true)]</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string User</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return (string)this["user"]; }</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { this["user"] = value; }</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ConfigurationProperty("password", IsRequired = true)]</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string Password</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return (string)this["password"]; }</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { this["password"] = value; }</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ConfigurationProperty("domain", IsRequired = true)]</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string Domain</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return (string)this["domain"]; }</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { this["domain"] = value; }</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; public class WindowsClientCredentialsBehavior : IEndpointBehavior</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string _user, _password, _domain;</span></p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public WindowsClientCredentialsBehavior(string user, string password, string domain)</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _user = user;</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _password = password;</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _domain = domain;</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClientCredentials clientCredentials = (from item in bindingParameters where item is ClientCredentials select item).FirstOrDefault() as ClientCredentials;</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (clientCredentials == null)</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientCredentials = new ClientCredentials();</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bindingParameters.Add(clientCredentials);</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential(_user, _password, _domain);</span></p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void Validate(ServiceEndpoint endpoint)</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClientCredentials clientCredentials = (from item in endpoint.Behaviors where item is ClientCredentials select item).FirstOrDefault() as ClientCredentials;</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (clientCredentials != null)</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endpoint.Behaviors.Remove(clientCredentials);</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">}</span></p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
  </channel>
</rss>