<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7445890102633762998</id><updated>2011-07-08T07:57:55.842-07:00</updated><title type='text'>Pablo Blamirez</title><subtitle type='html'>UK based .Net dude</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pabloblamirez.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7445890102633762998/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://pabloblamirez.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Pablo Blamirez AKA PaulBlamire</name><uri>http://www.blogger.com/profile/09019386514425522091</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7445890102633762998.post-4514059041100848171</id><published>2009-09-25T14:05:00.001-07:00</published><updated>2009-09-25T14:05:44.152-07:00</updated><title type='text'>Learning XNA – Registering Services</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Is it just me or the default syntax for registering/locating services a bit ugly. A couple of extension methods should help tidy that up a bit.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public static class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;GameExtensions&lt;br /&gt;   &lt;/span&gt;{&lt;br /&gt;       &lt;span style="color: blue"&gt;public static void &lt;/span&gt;AddService&amp;lt;I&amp;gt;(&lt;span style="color: blue"&gt;this &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Game &lt;/span&gt;game, I service) &lt;span style="color: blue"&gt;where &lt;/span&gt;I : &lt;span style="color: blue"&gt;class&lt;br /&gt;       &lt;/span&gt;{&lt;br /&gt;           game.Services.AddService(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(I), service);&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span style="color: blue"&gt;public static &lt;/span&gt;I GetService&amp;lt;I&amp;gt;(&lt;span style="color: blue"&gt;this &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Game &lt;/span&gt;game) &lt;span style="color: blue"&gt;where &lt;/span&gt;I : &lt;span style="color: blue"&gt;class&lt;br /&gt;       &lt;/span&gt;{&lt;br /&gt;           &lt;span style="color: blue"&gt;return &lt;/span&gt;game.Services.GetService(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(I)) as I;&lt;br /&gt;       }&lt;br /&gt;   }&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7445890102633762998-4514059041100848171?l=pabloblamirez.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pabloblamirez.blogspot.com/feeds/4514059041100848171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7445890102633762998&amp;postID=4514059041100848171' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7445890102633762998/posts/default/4514059041100848171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7445890102633762998/posts/default/4514059041100848171'/><link rel='alternate' type='text/html' href='http://pabloblamirez.blogspot.com/2009/09/learning-xna-registering-services.html' title='Learning XNA – Registering Services'/><author><name>Pablo Blamirez AKA PaulBlamire</name><uri>http://www.blogger.com/profile/09019386514425522091</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7445890102633762998.post-3437239936005572412</id><published>2008-10-10T15:35:00.001-07:00</published><updated>2008-10-10T15:35:19.096-07:00</updated><title type='text'>EntityFramework Transparent Lazy Load</title><content type='html'>&lt;p&gt;   &lt;br /&gt;Now I know there are other solutions to this scenario already, notably &lt;a title="http://code.msdn.microsoft.com/EFLazyLoading" href="http://code.msdn.microsoft.com/EFLazyLoading"&gt;http://code.msdn.microsoft.com/EFLazyLoading&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;However I wanted to work with the standard generated code, as it is an assumption on my part that this code will be better tested. &lt;/p&gt;  &lt;h4&gt;My Solution&lt;/h4&gt;  &lt;p&gt;Use PostSharp to weave aspects into the code to perform the appropriate IsLoaded and Load calls on the RelatedEnd of the accessed association.&lt;/p&gt;  &lt;p&gt;Warning:&lt;/p&gt;  &lt;p&gt;As with any other lazy load solution, just because you can doesn't mean that you should. Lazy loading can kill performance.   &lt;br /&gt;Please treat the ability to lazy load as a convenience and optimize your returned spans appropriately&lt;/p&gt;  &lt;h4&gt;Implementation&lt;/h4&gt;  &lt;p&gt;1) Install PostSharp V1.0RTM &lt;a href="http://www.postsharp.org/"&gt;http://www.postsharp.org/&lt;/a&gt; (Please consider donating 50 euros to them if you end up using their tool on an ongoing basis)&lt;/p&gt;  &lt;p&gt;2) Add the following references to your project&lt;/p&gt; PostSharp.Public;  &lt;br /&gt;PostSharp.Laos;  &lt;p&gt;3) Create a new .cs file containing the following code (Refactor to mutiple files if you want)&lt;/p&gt;  &lt;p&gt;using System;   &lt;br /&gt;using PostSharp.Extensibility;    &lt;br /&gt;using PostSharp.Laos;    &lt;br /&gt;using System.Reflection;    &lt;br /&gt;using System.Data.Objects.DataClasses;    &lt;br /&gt;using System.Collections; &lt;/p&gt;  &lt;p&gt;namespace &lt;strong&gt;&lt;em&gt;YourNamespace&lt;/em&gt;&lt;/strong&gt;    &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [Serializable]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public abstract class LazyLoadBase : OnMethodInvocationAspect    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Load the related end if we can    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; protected void Load(RelatedEnd end)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (end != null &amp;amp;&amp;amp; !end.IsLoaded)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; end.Load();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; [Serializable]   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class LazyLoadSetAttribute : LazyLoadBase    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Only add this aspect to properties that return an enumerable, RelatedEnd, i.e. EntityCollection    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override bool CompileTimeValidate(MethodBase method)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MethodInfo info = method as MethodInfo;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (info == null) return false;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; bool isRelatedEnd = typeof(RelatedEnd).IsAssignableFrom(info.ReturnType);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; bool isSet = typeof(IEnumerable).IsAssignableFrom(info.ReturnType);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return isSet &amp;amp;&amp;amp; isRelatedEnd;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void OnInvocation(MethodInvocationEventArgs eventArgs)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; eventArgs.Proceed();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RelatedEnd end = eventArgs.ReturnValue as RelatedEnd;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Load(end);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; [Serializable]   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class LazyLoadRefAttribute : LazyLoadBase    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Only add this aspect to properties that return an EntityObject    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override bool CompileTimeValidate(System.Reflection.MethodBase method)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MethodInfo info = method as MethodInfo;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return typeof(EntityObject).IsAssignableFrom(info.ReturnType);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void OnInvocation(MethodInvocationEventArgs eventArgs)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RelatedEnd end = GetRelatedEnd(eventArgs.Delegate);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Load(end);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; eventArgs.Proceed();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Infer the name of the associated property that returns the EntityReference for the EntityObject, and force a load   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private System.Data.Objects.DataClasses.RelatedEnd GetRelatedEnd(Delegate currentMethod)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string entityRefProperty = string.Format(&amp;quot;{0}Reference&amp;quot;, currentMethod.Method.Name);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (entityRefProperty.StartsWith(&amp;quot;~get_&amp;quot;)) entityRefProperty = entityRefProperty.Substring(5);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PropertyInfo prop = currentMethod.Method.ReflectedType.GetProperty(entityRefProperty);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (prop == null) return null;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return prop.GetValue(currentMethod.Target, null) as System.Data.Objects.DataClasses.RelatedEnd;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;3) Add the following lines to your AssemblyInfo.cs&lt;/p&gt;  &lt;p&gt;using &lt;strong&gt;&lt;em&gt;YourNamespace&lt;/em&gt;&lt;/strong&gt;;    &lt;br /&gt;[assembly: LazyLoadRefAttribute(AttributeTargetAssemblies = &amp;quot;&lt;em&gt;YOUR_ASSEMBLY_NAME&lt;/em&gt;&amp;quot;, AttributeTargetTypes = &amp;quot;&lt;em&gt;EF_OBJECTCONTEXT_NAMESPACE&lt;/em&gt;.*&amp;quot;)]    &lt;br /&gt;[assembly: LazyLoadSetAttribute(AttributeTargetAssemblies = &amp;quot;&lt;em&gt;YOUR_&lt;/em&gt;ASSEMBLY_NAME&amp;quot;, AttributeTargetTypes = &amp;quot;&lt;em&gt;EF_OBJECTCONTEXT_NAMESPACE&lt;/em&gt;.*&amp;quot;)]&lt;/p&gt;  &lt;h4&gt;Conclusion&lt;/h4&gt;  &lt;p&gt;And that's it, PostSharp will weave its magic when you build your project, leaving you free to focus on functionality first, optimization second.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7445890102633762998-3437239936005572412?l=pabloblamirez.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pabloblamirez.blogspot.com/feeds/3437239936005572412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7445890102633762998&amp;postID=3437239936005572412' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7445890102633762998/posts/default/3437239936005572412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7445890102633762998/posts/default/3437239936005572412'/><link rel='alternate' type='text/html' href='http://pabloblamirez.blogspot.com/2008/10/entityframework-transparent-lazy-load.html' title='EntityFramework Transparent Lazy Load'/><author><name>Pablo Blamirez AKA PaulBlamire</name><uri>http://www.blogger.com/profile/09019386514425522091</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7445890102633762998.post-534408353002275991</id><published>2008-09-26T13:33:00.001-07:00</published><updated>2008-09-26T13:33:59.968-07:00</updated><title type='text'>Turn Off Visual Studio Outlining - AKA Regions</title><content type='html'>&lt;p&gt;   &lt;br /&gt;Menu: Tools -&amp;gt; Options&lt;/p&gt;  &lt;p&gt;Treeview: Text Editor -&amp;gt; C# -&amp;gt; Advanced &lt;/p&gt;  &lt;p&gt;Properties Heading: Outlining&lt;/p&gt;  &lt;p&gt;Property: Enter outlining mode when files open. Untick&lt;/p&gt;  &lt;p&gt;Now all regions will be expanded by default when you open some C# source&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7445890102633762998-534408353002275991?l=pabloblamirez.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pabloblamirez.blogspot.com/feeds/534408353002275991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7445890102633762998&amp;postID=534408353002275991' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7445890102633762998/posts/default/534408353002275991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7445890102633762998/posts/default/534408353002275991'/><link rel='alternate' type='text/html' href='http://pabloblamirez.blogspot.com/2008/09/turn-off-visual-studio-outlining-aka.html' title='Turn Off Visual Studio Outlining - AKA Regions'/><author><name>Pablo Blamirez AKA PaulBlamire</name><uri>http://www.blogger.com/profile/09019386514425522091</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7445890102633762998.post-3480490470181246396</id><published>2008-05-20T16:02:00.001-07:00</published><updated>2008-05-20T16:14:49.068-07:00</updated><title type='text'>RouteData -&gt; Controller.Action(params) validation</title><content type='html'>&lt;p&gt;   &lt;br /&gt;Following on from &lt;a href="http://www.haacked.com/archive/2008/05/05/routeevaluator-for-unit-testing-routes.aspx"&gt;Phil Haack's excellent route evaluator for unit testing routes article&lt;/a&gt;, I got to wondering that if in addition to testing that for the presence of a RouteData match in our unit tests if we could also test that the invoked method and it's supplied parameters meet our expectations too.&lt;/p&gt;  &lt;p&gt;To that end I have created an extension method for the RouteData class called VerifyAction which takes the generic parameter of the type of controller that we expect to be invoked and a lambda expression for a method call that returns an ActionResult value.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;As with any extension method remember to include the namespace in your using clauses to make it available to the compiler&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;The specified lambda expression will take the parameters that should have been extracted from the virtualPath or supplied by the routes defaults.&lt;/p&gt;  &lt;p&gt;An example is probably in order:&lt;/p&gt;  &lt;h4&gt;Example Unit Test&lt;/h4&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public void &lt;/span&gt;TestHomeControllerActionWithIdParam()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;routes = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;RouteCollection&lt;/span&gt;();&lt;br /&gt;    &lt;span style="color: #2b91af"&gt;GlobalApplication&lt;/span&gt;.RegisterRoutes(routes);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;evaluator = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;RouteEvaluator&lt;/span&gt;(routes);&lt;br /&gt;    &lt;span style="color: #2b91af"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;RouteData&lt;/span&gt;&amp;gt; matchingRouteData = evaluator.GetMatches(&lt;span style="color: #a31515"&gt;&amp;quot;~/Home/ActionWithIdParam/6&amp;quot;&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.IsTrue(matchingRouteData.Count &amp;gt; 0);&lt;br /&gt;    matchingRouteData[0].VerifyAction&amp;lt;&lt;span style="color: #2b91af"&gt;HomeController&lt;/span&gt;&amp;gt;(c =&amp;gt; c.ActionWithIdParam(6));&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;My expectation is that the url '&lt;span style="color: #a31515"&gt;&lt;font color="#000000"&gt;~/Home/ActionWithIdParam/6' should invoke the ActionWithIdParam method found on HomeController passing in an Id of 6.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Validation Checks&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The VerifyAction method checks the following aspects to determine if our expectations are met:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;That the RouteData.Values[&amp;quot;Controller&amp;quot;] value is equal to the Controller class supplied (minus the controller extension) &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;That the RouteData.Values[&amp;quot;Action&amp;quot;] value is equal to the method name extracted from the lambda expression &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;That each argument of the action method has a corresponding entry in the RouteData.Values dictionary &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;That a null value is not supplied for an action method argument that expects a value type (eg int etc) &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;That each supplied argument value can be converted to the expected argument type &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;That each supplied argument value equals the expected argument value &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;If any of the checks fail an exception is thrown detailing the problem.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Feedback&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Obviously that is what I intend that the code should do and hopefully it does :-) Seriously though when you find a bug, make an improvement or jump to the conclusion that the approach is flawed please can you post in the comments so that I can reap the benefits too, many thanks in advance.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The code for the extension method can be found below.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Thanks for stopping by,&lt;br /&gt;  &lt;br /&gt;Paul Blamire &lt;/p&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;RouteDataEvaluator Code&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;&lt;br /&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Collections.Generic;&lt;br /&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Web.Routing;&lt;br /&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Web;&lt;br /&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Reflection;&lt;br /&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Linq.Expressions;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;namespace &lt;font color="#999999"&gt;MyNameSpace&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;public static class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;RouteDataEvaluator&lt;br /&gt;    &lt;/span&gt;{&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;RouteDataActionException &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;Exception&lt;br /&gt;        &lt;/span&gt;{&lt;br /&gt;            &lt;span style="color: blue"&gt;public &lt;/span&gt;RouteDataActionException(&lt;span style="color: blue"&gt;string &lt;/span&gt;message)&lt;br /&gt;                : &lt;span style="color: blue"&gt;base&lt;/span&gt;(message)&lt;br /&gt;            {&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: blue"&gt;public static bool &lt;/span&gt;VerifyAction&amp;lt;CT&amp;gt;(&lt;span style="color: blue"&gt;this &lt;/span&gt;&lt;span style="color: #2b91af"&gt;RouteData &lt;/span&gt;data, &lt;span style="color: #2b91af"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;CT, System.Web.Mvc.&lt;span style="color: #2b91af"&gt;ActionResult&lt;/span&gt;&amp;gt;&amp;gt; expr) &lt;span style="color: blue"&gt;where &lt;/span&gt;CT : System.Web.Mvc.&lt;span style="color: #2b91af"&gt;Controller&lt;br /&gt;        &lt;/span&gt;{&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: blue"&gt;const string &lt;/span&gt;controllerKey = &lt;span style="color: #a31515"&gt;&amp;quot;Controller&amp;quot;&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: blue"&gt;const string &lt;/span&gt;actionKey = &lt;span style="color: #a31515"&gt;&amp;quot;Action&amp;quot;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: blue"&gt;bool &lt;/span&gt;result = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #2b91af"&gt;LambdaExpression &lt;/span&gt;lambda = expr &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;LambdaExpression&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #2b91af"&gt;MethodCallExpression &lt;/span&gt;methodCall = lambda.Body &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MethodCallExpression&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: blue"&gt;string &lt;/span&gt;cName = methodCall.Object.Type.Name;&lt;br /&gt;            &lt;span style="color: blue"&gt;string &lt;/span&gt;cNameLower = cName.ToLower();&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: blue"&gt;if &lt;/span&gt;(SafeString(data.Values[controllerKey]) != ((cNameLower.EndsWith(&lt;span style="color: #a31515"&gt;&amp;quot;controller&amp;quot;&lt;/span&gt;)) ? cName.Substring(0, cName.Length - 10) : cName))&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;RouteDataActionException&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Expected controller '{0}', matched '{1}'&amp;quot;&lt;/span&gt;, cName, data.Values[controllerKey]));&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: blue"&gt;if &lt;/span&gt;(SafeString(data.Values[actionKey]) != methodCall.Method.Name)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;RouteDataActionException&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Expected action '{0}', matched '{1}'&amp;quot;&lt;/span&gt;, methodCall.Method.Name, data.Values[actionKey]));&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #2b91af"&gt;ParameterInfo&lt;/span&gt;[] parameters = methodCall.Method.GetParameters();&lt;br /&gt;            &lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;int &lt;/span&gt;i = 0; i &amp;lt; methodCall.Arguments.Count; i++)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #2b91af"&gt;ConstantExpression &lt;/span&gt;param = methodCall.Arguments[i] &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ConstantExpression&lt;/span&gt;;&lt;br /&gt;                &lt;span style="color: blue"&gt;string &lt;/span&gt;paramName = parameters[i].Name;&lt;br /&gt;                &lt;span style="color: blue"&gt;if &lt;/span&gt;(!data.Values.ContainsKey(paramName))&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;RouteDataActionException&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Expected parameter '{0}', no matching parameter found&amp;quot;&lt;/span&gt;, paramName));&lt;br /&gt;                }&lt;br /&gt;                &lt;span style="color: blue"&gt;else&lt;br /&gt;                &lt;/span&gt;{&lt;br /&gt;                    &lt;span style="color: blue"&gt;string &lt;/span&gt;passedData = SafeString(data.Values[paramName]);&lt;br /&gt;                    &lt;span style="color: blue"&gt;if &lt;/span&gt;(param.Type.IsValueType &amp;amp;&amp;amp; passedData == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;                    {&lt;br /&gt;                        &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;RouteDataActionException&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Expected '{0}' parameter value of value type '{1}' , unable to convert from null&amp;quot;&lt;/span&gt;, paramName, param.Type.Name));&lt;br /&gt;                    }&lt;br /&gt;                    &lt;span style="color: blue"&gt;object &lt;/span&gt;convertedData = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br /&gt;                    &lt;span style="color: blue"&gt;try&lt;br /&gt;                    &lt;/span&gt;{&lt;br /&gt;                        convertedData = &lt;span style="color: #2b91af"&gt;Convert&lt;/span&gt;.ChangeType(passedData, param.Type);&lt;br /&gt;                        &lt;span style="color: blue"&gt;if &lt;/span&gt;(!((convertedData == &lt;span style="color: blue"&gt;null &lt;/span&gt;&amp;amp;&amp;amp; param.Value == &lt;span style="color: blue"&gt;null&lt;/span&gt;) || (convertedData != &lt;span style="color: blue"&gt;null &lt;/span&gt;&amp;amp;&amp;amp; convertedData.Equals(param.Value))))&lt;br /&gt;                        {&lt;br /&gt;                            &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;RouteDataActionException&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Expected '{0}' parameter value of '{1}' , actual data '{2}'&amp;quot;&lt;/span&gt;, paramName, param.Value, data.Values[paramName]));&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    &lt;span style="color: blue"&gt;catch &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;FormatException&lt;/span&gt;)&lt;br /&gt;                    {&lt;br /&gt;                        &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;RouteDataActionException&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Expected '{0}' parameter value of value type '{1}' , unable to convert from actual data '{2}'&amp;quot;&lt;/span&gt;, paramName, param.Type.Name, data.Values[paramName]));&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;result;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: blue"&gt;private static string &lt;/span&gt;SafeString(&lt;span style="color: blue"&gt;object &lt;/span&gt;value)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: blue"&gt;if &lt;/span&gt;(value == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;)&lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: blue"&gt;else&lt;br /&gt;            &lt;/span&gt;{&lt;br /&gt;                &lt;span style="color: blue"&gt;return &lt;/span&gt;value.ToString();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7445890102633762998-3480490470181246396?l=pabloblamirez.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pabloblamirez.blogspot.com/feeds/3480490470181246396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7445890102633762998&amp;postID=3480490470181246396' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7445890102633762998/posts/default/3480490470181246396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7445890102633762998/posts/default/3480490470181246396'/><link rel='alternate' type='text/html' href='http://pabloblamirez.blogspot.com/2008/05/routedata-controlleractionparams.html' title='RouteData -&amp;gt; Controller.Action(params) validation'/><author><name>Pablo Blamirez AKA PaulBlamire</name><uri>http://www.blogger.com/profile/09019386514425522091</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7445890102633762998.post-8191533651008565936</id><published>2007-06-29T16:42:00.001-07:00</published><updated>2007-06-29T16:42:44.410-07:00</updated><title type='text'>Monorail - graphs</title><content type='html'>&lt;p&gt;&lt;br&gt;Loving Castle Project's&amp;nbsp;&lt;a href="http://www.castleproject.org/monorail/index.html" target="_blank"&gt;Monorail&lt;/a&gt;.&amp;nbsp; Having used webforms for the last 5 years&amp;nbsp;I'm currently&amp;nbsp;enjoying the freedom&amp;nbsp;to generate whatever HTML I desire. For most of the applications I work on CRUD screens are the order of the day and as such the HTML is fairly straightforward.&lt;/p&gt; &lt;p&gt;Very occasionally though I miss some of the web-controls that are available. Graphing is an excellent example of that. Having briefly contemplated writing a server-side control to squirt out a jpeg/gif (couldn't find any 3rd party graphing controls to do it) a colleague of mine discovered &lt;a href="http://www.anychart.com/products/anychart/index.shtml" target="_blank"&gt;AnyChart&lt;/a&gt;, a flash based graphing component. &lt;/p&gt; &lt;p&gt;Perfect&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7445890102633762998-8191533651008565936?l=pabloblamirez.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pabloblamirez.blogspot.com/feeds/8191533651008565936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7445890102633762998&amp;postID=8191533651008565936' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7445890102633762998/posts/default/8191533651008565936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7445890102633762998/posts/default/8191533651008565936'/><link rel='alternate' type='text/html' href='http://pabloblamirez.blogspot.com/2007/06/monorail-graphs.html' title='Monorail - graphs'/><author><name>Pablo Blamirez AKA PaulBlamire</name><uri>http://www.blogger.com/profile/09019386514425522091</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7445890102633762998.post-5956702190894256692</id><published>2007-06-29T16:17:00.001-07:00</published><updated>2007-06-29T16:17:25.588-07:00</updated><title type='text'>Castle Project - ActiveRecord and nHibernate</title><content type='html'>&lt;p&gt;For anyone new to using Castle Projects excellent &lt;a href="http://www.castleproject.org/activerecord/index.html" target="_blank"&gt;ActiveRecord&lt;/a&gt; implementation I would recommend the following book&amp;nbsp;to gain a good grounding in &lt;a href="http://www.castleproject.org/activerecord/index.html" target="_blank"&gt;(n)Hibernate&lt;/a&gt;.  &lt;p&gt;Sometimes only the power of hsql will cut it...  &lt;p&gt;&lt;a href="http://www.manning.com/bauer/"&gt;http://www.manning.com/bauer/&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7445890102633762998-5956702190894256692?l=pabloblamirez.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pabloblamirez.blogspot.com/feeds/5956702190894256692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7445890102633762998&amp;postID=5956702190894256692' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7445890102633762998/posts/default/5956702190894256692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7445890102633762998/posts/default/5956702190894256692'/><link rel='alternate' type='text/html' href='http://pabloblamirez.blogspot.com/2007/06/castle-project-activerecord-and.html' title='Castle Project - ActiveRecord and nHibernate'/><author><name>Pablo Blamirez AKA PaulBlamire</name><uri>http://www.blogger.com/profile/09019386514425522091</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
