<feed version="0.3" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns="http://purl.org/atom/ns#" xml:lang="en-US"><title>Kyle Finley</title><link rel="alternate" type="text/html" href="http://kylefinley.net/default.aspx" /><tagline type="text/html">Agile, .NET, and Random Thoughts</tagline><id>http://kylefinley.net/default.aspx</id><author><url>http://kylefinley.net/default.aspx</url></author><generator url="http://communityserver.org" version="1.1.0.50615">Community Server</generator><modified>2007-12-18T18:25:00Z</modified><entry><title>Next Trip Idea - US West Coast Kite / Road Trip</title><link rel="alternate" type="text/html" href="http://kylefinley.net/archive/2011/12/23/West_Coast_Kite_Road_Trip.aspx" /><id>c5cb4a99-bbac-452f-896a-397bc31c9b4b:1635</id><created>2011-12-23T17:21:00Z</created><content type="text/html" mode="escaped">&lt;p&gt;
This is a bit off the tech topic but I thought I'd post it anyways since my blog has been Seriously neglected over the year.  
&lt;/p&gt;
&lt;p&gt;
A few years back I did an amazing combination of a road trip, ski bum season, and kite trip all in one.  I took 4 months off from work and first went from Boston to Breckenridge, CO, driving in my 200 Jeep Wrangler.  I was there from March 1 until the end of the season.  While I was there I worked in a ski rental shop part time to get the 5 Mountain pass (Vail, Beaver Creek, Breck, Keystone, and Arapahoe Bay) and got as much time on the snow as I could.  I would wake up every day and look at the amount of snow and wind and decide what I'd do with my day.  Most days I would snowboard in the mornings and once things were tracked out I'd head to Dillon Reservoir and snow kite in the afternoons.  In the 6 weeks I was there I got 16 days on the kite and 18 days on the mountain.  After Colorado I drove to Arkansas to drop my Jeep at my brothers then flew to St. Lucia for 2 weeks of kiteboarding at &lt;a href='http://www.slucia.com/kitesurf' target='_blank'&gt;The Reef.&lt;/a&gt;  Once back in the states I drove to South Texas and started my road trip in South Padre. and drove around the Gulf Coast and up the East Coast back to Boston.  My goal was to kiteboard in every state that touched water.  Over a course of 7 weeks I went to 26 beaches and kiteboarded in 12 of the states.  Since that trip I've wanted to expand the goal to include every state that touches water in the US.  I came up with this idea of doing the US West Coast in the same style and think it's about time to start planning it.
&lt;/p&gt;
&lt;p&gt;
My plan is to drive my 1973 Convertible Volkswagen Beetle from Boulder, CO to Vancouver, BC then head down the Pacific Coast to San Diego and possibly Baja California.  From there I'd head back to Boulder to put the car back in storage and head back to Boston.  Or if I found an amazing place to keep it in CA I'd drive it there and find a place to store it.
&lt;/p&gt;
&lt;p&gt;
For the drive out to Vancouver I'd take the path through Wyoming and stop at Yellowstone National Park then head west to Portland to hit the Gorge for a few days.  Then head north to Vancouver and kite some of the spots up in BC. Then head back to Seattle then hug the coast back down to Portland for another few days in the Gorge.  From there the plan is stay on 101 and CA Rt. 1 as much as possible.  Camping and couch surfing my way stopping at every good kite spot for at least a day.
&lt;/p&gt;
Here's a rough &lt;a href='http://g.co/maps/xyuvk' target='_blank'&gt;map of the route&lt;/a&gt; I'd take.
&lt;p&gt;
The only question is when can I make it happen.  First I need to get my Bug out of storage and in the shop in Boulder.  I've used &lt;a href='
http://www.germanautoboulder.com' target='_blank'&gt;German Auto&lt;/a&gt; before and trust they can set my old bug up for the trip Then make sure I've got enough cash and time to do the trip.  I'm thinking about 3 months should do it.  
&lt;/p&gt;
&lt;p&gt;
My last trip was about twice as long and I was very low tech on that trip (no smart phone, no GPS, no wireless) but this trip will be documented better. I will have a GPS running but only to track my path, not to guide me.  I prefer to rely on a road atlas, signs, and getting lost.  Getting lost is sometimes the best part of road trips, it leads to the unexpected.
&lt;/p&gt;
&lt;p&gt;
I'm targeting late Summer / early Fall for the trip but only time will tell if I can do it this year.
&lt;/p&gt;&lt;img src="http://kylefinley.net/aggbug.aspx?PostID=1635" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://kylefinley.net/commentrss.aspx?PostID=1635</wfw:commentRss></entry><entry><title>Steve Jobs : 1955 - 2011</title><link rel="alternate" type="text/html" href="http://kylefinley.net/archive/2011/10/06/1574.aspx" /><id>c5cb4a99-bbac-452f-896a-397bc31c9b4b:1574</id><created>2011-10-06T14:16:00Z</created><content type="text/html" mode="escaped">With the passing of Steve Jobs we have lost an amazing leader in the world of software and consumer electronics innovation.  His impact on the world of computer and consumer electronic will never be forgotten and probably never overshadowed.  His ability to think big and push people to do produce Amazing products was like no other. 

Rest in peace Mr. Jobs.  You will be remembered and missed.
&lt;br&gt;&lt;br&gt;
&lt;img src="/steve_jobs3.jpg" width="200"&gt;&lt;img src="http://kylefinley.net/aggbug.aspx?PostID=1574" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://kylefinley.net/commentrss.aspx?PostID=1574</wfw:commentRss></entry><entry><title>The Surprising Truth About What Motivates Us</title><link rel="alternate" type="text/html" href="http://kylefinley.net/archive/2010/04/12/1471.aspx" /><id>c5cb4a99-bbac-452f-896a-397bc31c9b4b:1471</id><created>2010-06-23T06:28:00Z</created><content type="text/html" mode="escaped">&lt;p&gt;A good talk on some studies on what really motivates people.  Personally the results are not that surprising as I've felt this way since my first programming gig but I know it's surprising to some, especially managers that have not been around software development that much. The same type of info is also expressed in &lt;a href="http://www.joelonsoftware.coms" target="_blank"&gt;Joal Spolsky's&lt;/a&gt; book &lt;a href="http://www.joelonsoftware.com/items/2007/06/05.html" target="_blank"&gt;Smart and Gets Things Done&lt;/a&gt;.  Which is a great book and a must read for anyone who participates in hiring resources for technical jobs. Give it a watch and pass it on to your managers.&lt;/p&gt;
&lt;p&gt;
&lt;object width="640" height="385"&gt;
&lt;param name="movie" value="http://www.youtube.com/v/u6XAPnuFjJc&amp;hl=en_US&amp;fs=1&amp;"&gt;
&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;
&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;
&lt;embed src="http://www.youtube.com/v/u6XAPnuFjJc&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" width="445" height="364"&gt;
&lt;/embed&gt;
&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=u6XAPnuFjJc" title="Original Video" target="_blank"&gt;Original Video&lt;/a&gt;&lt;/p&gt;&lt;img src="http://kylefinley.net/aggbug.aspx?PostID=1471" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://kylefinley.net/commentrss.aspx?PostID=1471</wfw:commentRss></entry><entry><title>Merge Two Objects into an Anonymous Type (while ignoring some properties)</title><link rel="alternate" type="text/html" href="http://kylefinley.net/archive/2009/10/15/1339.aspx" /><id>c5cb4a99-bbac-452f-896a-397bc31c9b4b:1339</id><created>2009-10-16T02:16:30Z</created><content type="text/html" mode="escaped">&lt;p&gt;The other day I ran into this situation and found not only a good solution but also built it up a bit. I thought I would share it.&lt;/p&gt;
&lt;p&gt;My situation was this, I needed to combine an object with some additional information, as JSON, and pass it back to the original caller, which happens to be an AJAX call. For this post I'm going to focus on the first part of the situation, combining a concrete object with additional info, I'll address serializing to JSON in a future post.&lt;/p&gt;
&lt;p&gt;Lately I've been utilizing &lt;a href="http://msdn.microsoft.com/en-us/library/bb397696.aspx" target="_blank" title="Anonymous Types"&gt;Anonymous Types&lt;/a&gt; a lot more. In this situation my 'additional information' mentioned above happens to be represented by an Anonymous Type, therefore my first thought was to create something that would take a couple of objects (concrete or anonymous) and merge them into a new anonymous type that I create on the fly, then I could serialize that Anonymous Type to JSON to return. Some of you may be thinking "Wait, you can pass around Anonymous Types, they have method scope!" Actually, yes you can pass them around all you want, the thing is you only get an Object to work with and can only access it's members using Reflection or you can cast that Object back into an Anonymous Type which shares the same signature. Check out this &lt;a href="http://tomasp.net/blog/cannot-return-anonymous-type-from-method.aspx" target="_blank"&gt;post&lt;/a&gt; for more info on this.&lt;/p&gt;
&lt;p&gt;So before doing any coding myself I did a quick search to see if anyone else had solved this problem. I stumbled across &lt;a href="http://www.developmentalmadness.com/Default.aspx" title="Mark Miller" target="_blank"&gt;Mark Miller's&lt;/a&gt; post &lt;a href="http://www.developmentalmadness.com/archive/2008/02/12/extend-anonymous-types-using.aspx" title="Extending Anonymous Types using Reflection.Emit" target="_blank"&gt;Extending Anonymous Types using Reflection.Emit&lt;/a&gt;. Perfect, exactly the direction I was thinking! I tested it out and it worked exactly as expected and is written basically how I was thinking so all is good right? Well, not completely. One thing I wanted from the solution was the ability to ignore some properties from the source objects. Basically think &lt;a href="http://www.codeplex.com/AutoMapper" title="AutoMapper" target="_blank"&gt;AutoMapper&lt;/a&gt; CreateMap / ForMember / option.Ignore functionality while merging two objects into a completely new object created on the fly. If you're wondering why not just use AutoMapper for this, well unfortunately it doesn't work with Anonymous Types, or at least I haven't figured out how to make it (and even if it can the syntax would be pretty clumsy).&lt;/p&gt;
&lt;p&gt;In coming up with this solution I looked at the way AutoMapper does it's thing but decided I really didn't want to deal with lambdas in my syntax. I wanted something that was very fluid and simple. So as any TDD'er I started out with a unit test and just started typing the syntax I wanted. Here is what I came up with:&lt;/p&gt;
&lt;div style="border: 1px solid black; padding: 5px; background-color: black; font-family: 'Helvetica';"&gt;
  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;var&lt;/span&gt; result =&lt;span style="color: rgb(255, 198, 109);"&gt;TypeMerger&lt;/span&gt;.Ignore(obj1.SomeProperty).Ignore(obj2.AnotherProperty).MergeTypes(obj1, obj2) ;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I thought this was pretty simple and easily showed what the code was doing. The idea here is to use &lt;a href="http://martinfowler.com/dslwip/MethodChaining.html" title="Method Chaining" target="_blank"&gt;Method Chaining&lt;/a&gt; in order to have a smooth syntax. (yes, I've been using JQuery a lot lately and if you're familiar with StructureMap you may recognize the pattern too.) If you're not familiar with the Method Chaining pattern it is more common than you think. Here is Martin Fowler's explanation of the pattern:&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;i&gt;"Make modifier methods return the host object so that multiple modifiers can be invoked in a single expression."&lt;/i&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Method Chaining is used throughout the JQuery framework as well as in the .NET Framework (i.e. DateTime.Now.AddDays(1);). It's a pretty easy pattern to build into your classes and provide fluid interaction with your classes.&lt;/p&gt;
&lt;p&gt;For my situation I am dealing with a static class (TypeMerger), which makes the Method Chaining setup a little bit more complex but not much. In the most basic form Method Chaining will return the object for which the call was made on. This doesn't work for Static classes so we have to use an &lt;a href="http://martinfowler.com/dslwip/ExpressionBuilder.html" title="Expression Builder" target="_blank"&gt;Expression Builder&lt;/a&gt;. So what is an Expression Builder? I basically think of it as a buddy class for the target object that will be used to complete the Method Chaining process. For this situation that means keeping track of the items we want to ignore when we merge two types.&lt;/p&gt;
&lt;p&gt;Here is the companion class that handles the details of tracking the properties we want to ignore. Introducing the TypeMergerPolicy class:&lt;/p&gt;
&lt;div style="border: 1px solid black; padding: 5px; background-color: black; font-family: 'Helvetica';"&gt;
  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;font color="#cc7832"&gt;&lt;b&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;using&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;font&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;span style="font-weight: normal;"&gt;System;&lt;/span&gt;&lt;br&gt;
  &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;using&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;font&gt;&lt;span style="font-weight: normal;"&gt;System.Collections;&lt;/span&gt;&lt;br&gt;
  &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;using&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;font&gt;&lt;span style="font-weight: normal;"&gt;System.Collections.Generic;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;namespace&lt;/font&gt;&lt;/span&gt; &lt;font&gt;Finley.Common&lt;br&gt;
  {&lt;br&gt;
  &lt;span style="color: rgb(255, 198, 109);"&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;b&gt;&lt;font&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: normal;"&gt;public&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;class&lt;/font&gt;&lt;/span&gt; &lt;b&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;TypeMergerPolicy&lt;/span&gt;&lt;br&gt;
  &lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;span style="font-weight: normal;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;b&gt;&lt;font&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;private&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="color: rgb(104, 151, 187);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;IList&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;font&gt;&lt;span style="font-weight: normal;"&gt;ignored;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;b&gt;&lt;font&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;public&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="color: rgb(104, 151, 187);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;IList&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;font&gt;&lt;span style="font-weight: normal;"&gt;Ignored&lt;/span&gt;&lt;br&gt;
  &lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;b&gt;&lt;font&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;font&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;b&gt;&lt;font&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;{&lt;/span&gt;&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;get&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;font&gt;&lt;span style="font-weight: normal;"&gt;{&lt;/span&gt;&lt;/font&gt; &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;return&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;this&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;.ignored; }&lt;br&gt;
  &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;b&gt;&lt;font&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;font&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;b&gt;&lt;font&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;font&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;}&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;b&gt;&lt;font&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;public&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;font&gt;&lt;span style="font-weight: normal;"&gt;TypeMergerPolicy(&lt;/span&gt;&lt;/font&gt;&lt;span style="color: rgb(104, 151, 187);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;IList&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;font&gt;&lt;span style="font-weight: normal;"&gt;ignored)&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;{&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;this&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;.ignored = ignored;&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;b&gt;&lt;font&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;public&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;font&gt;&lt;span style="font-weight: normal;"&gt;TypeMergerPolicy(&lt;/span&gt;&lt;/font&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;object&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;font&gt;&lt;span style="font-weight: normal;"&gt;ignoreValue)&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;{&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;ignored =&lt;/span&gt;&lt;/font&gt; &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;new&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="color: rgb(255, 198, 109);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;List&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;object&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;&amp;gt;();&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;ignored.Add(ignoreValue);&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;b&gt;&lt;font&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;font&gt;&lt;font&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;b&gt;&lt;font&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;public&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="color: rgb(255, 198, 109);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;TypeMergerPolicy&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;font&gt;&lt;span style="font-weight: normal;"&gt;Ignore(&lt;/span&gt;&lt;/font&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;object&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;font&gt;&lt;span style="font-weight: normal;"&gt;value)&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;{&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;this&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;.ignored.Add(value);&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;return&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;this&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;;&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;b&gt;&lt;font&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;font&gt;&lt;font&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;b&gt;&lt;font&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;public&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="color: rgb(255, 198, 109);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;Object&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;font&gt;&lt;span style="font-weight: normal;"&gt;MergeTypes(&lt;/span&gt;&lt;/font&gt;&lt;span style="color: rgb(255, 198, 109);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;Object&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;font&gt;&lt;span style="font-weight: normal;"&gt;values1,&lt;/span&gt;&lt;/font&gt; &lt;span style="color: rgb(255, 198, 109);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;Object&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;font&gt;&lt;span style="font-weight: normal;"&gt;values2)&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;return&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="color: rgb(255, 198, 109);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;TypeMerger&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;.MergeTypes(values1, values2,&lt;/span&gt;&lt;/font&gt; &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;this&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-weight: normal;"&gt;);&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;br&gt;
  }&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Looks pretty simple but what's going on here? The TypeMergerPolicy class has an internal List of objects which store the reference to the items to exclude while merging. The MergeTypes method at the end is what allows us to stop the chain. This method simply calls MergeTypes on the Static class TypeMerger passing itself as an argument.&lt;/p&gt;
&lt;p&gt;In order to make this all work of course I had to modify the original TypeMerger class to use the new TypeMergerPolicy class. Here are the changes I had to make:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Add a private static TypeMergerPolicy object to store the items to ignore.&lt;/li&gt;

  &lt;li&gt;Overload the constructor to take a TypeMergerPolicy class (used by the TypeMergerPolicy.MergeTypes method).&lt;/li&gt;

  &lt;li&gt;Modify a few of the methods to use the TypeMergerPolicy class to exclude properties.&lt;/li&gt;

  &lt;li&gt;And finally the Ignore method that kicks off the Method Chaining.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are the modifications I made to the TypeMerger Class:&lt;/p&gt;
&lt;div style="border: 1px solid black; padding: 5px; background-color: black; font-family: 'Helvetica';"&gt;
  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;font color="#cc7832"&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(204, 120, 50);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(255, 198, 109);"&gt;TypeMergerPolicy&lt;/span&gt; typeMergerPolicy = &lt;span style="color: rgb(204, 120, 50);"&gt;null&lt;/span&gt;;&lt;/font&gt;&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(204, 120, 50);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(255, 198, 109);"&gt;Object&lt;/span&gt; MergeTypes(&lt;span style="color: rgb(255, 198, 109);"&gt;Object&lt;/span&gt; values1, &lt;span style="color: rgb(255, 198, 109);"&gt;Object&lt;/span&gt; values2, &lt;span style="color: rgb(255, 198, 109);"&gt;TypeMergerPolicy&lt;/span&gt; policy)&lt;br&gt;
  {&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;/span&gt;typeMergerPolicy = policy;&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(204, 120, 50);"&gt;return&lt;/span&gt; MergeTypes(values1, values2);&lt;br&gt;
  }&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;br&gt;
  &lt;span style="color: rgb(204, 120, 50);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(204, 120, 50);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(255, 198, 109);"&gt;Object&lt;/span&gt;[] MergeValues(&lt;span style="color: rgb(255, 198, 109);"&gt;Object&lt;/span&gt; values1, &lt;span style="color: rgb(255, 198, 109);"&gt;Object&lt;/span&gt; values2)&lt;br&gt;
  {&lt;br&gt;
  &lt;span style="color: rgb(255, 198, 109);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;PropertyDescriptorCollection&lt;/span&gt; pdc1 = &lt;span style="color: rgb(255, 198, 109);"&gt;TypeDescriptor&lt;/span&gt;.GetProperties(values1);&lt;br&gt;
  &lt;span style="color: rgb(255, 198, 109);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;PropertyDescriptorCollection&lt;/span&gt; pdc2 = &lt;span style="color: rgb(255, 198, 109);"&gt;TypeDescriptor&lt;/span&gt;.GetProperties(values2);&lt;br&gt;
  &lt;br&gt;&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(255, 198, 109);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(255, 198, 109);"&gt;Object&lt;/span&gt;&amp;gt; values = &lt;span style="color: rgb(204, 120, 50);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(255, 198, 109);"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(255, 198, 109);"&gt;Object&lt;/span&gt;&amp;gt;();&lt;br&gt;&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;for&lt;/span&gt; (&lt;span style="color: rgb(204, 120, 50);"&gt;int&lt;/span&gt; i = &lt;span style="color: rgb(104, 151, 187);"&gt;0&lt;/span&gt;; i &amp;lt; pdc1.Count; i++) {&lt;br&gt;
  &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(204, 120, 50);"&gt;if&lt;/span&gt; (typeMergerPolicy == &lt;span style="color: rgb(204, 120, 50);"&gt;null&lt;/span&gt; || !typeMergerPolicy.Ignored.Contains(pdc1[i].GetValue(values1)))&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;values.Add(pdc1[i].GetValue(values1));&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;font color="#ffffff"&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;for&lt;/span&gt; (&lt;span style="color: rgb(204, 120, 50);"&gt;int&lt;/span&gt; i = &lt;span style="color: rgb(104, 151, 187);"&gt;0&lt;/span&gt;; i &amp;lt; pdc2.Count; i++) {&lt;br&gt;
  &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(204, 120, 50);"&gt;if&lt;/span&gt; (typeMergerPolicy == &lt;span style="color: rgb(204, 120, 50);"&gt;null&lt;/span&gt; || !typeMergerPolicy.Ignored.Contains(pdc2[i].GetValue(values2)))&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;values.Add(pdc2[i].GetValue(values2));&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;font color="#ffffff"&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;return&lt;/span&gt; values.ToArray();&lt;br&gt;
  }&lt;/font&gt;&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(204, 120, 50);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(255, 198, 109);"&gt;PropertyDescriptor&lt;/span&gt;[] GetProperties(&lt;span style="color: rgb(255, 198, 109);"&gt;Object&lt;/span&gt; values1, &lt;span style="color: rgb(255, 198, 109);"&gt;Object&lt;/span&gt; values2)&lt;br&gt;
  {&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;font color="green"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;//dynamic list to hold merged list of properties&lt;/font&gt;&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;List&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;lt;&lt;/span&gt;PropertyDescriptor&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;gt; properties =&lt;/span&gt; &lt;span style="color: rgb(204, 120, 50);"&gt;new&lt;/span&gt; List&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;lt;&lt;/span&gt;PropertyDescriptor&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;gt;();&lt;/span&gt;&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;font color="green"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;//get the properties from both objects&lt;/font&gt;&lt;br&gt;
  &lt;span style="color: rgb(255, 198, 109);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;PropertyDescriptorCollection&lt;/span&gt; pdc1 = &lt;span style="color: rgb(255, 198, 109);"&gt;TypeDescriptor&lt;/span&gt;.GetProperties(values1);&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(255, 198, 109);"&gt;PropertyDescriptorCollection&lt;/span&gt; pdc2 = &lt;span style="color: rgb(255, 198, 109);"&gt;TypeDescriptor&lt;/span&gt;.GetProperties(values2);&lt;/span&gt;&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;font color="green"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;//add properties from values1&lt;/font&gt;&lt;br&gt;
  &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;for&lt;/span&gt; (&lt;span style="color: rgb(204, 120, 50);"&gt;int&lt;/span&gt; i = &lt;span style="color: rgb(104, 151, 187);"&gt;0&lt;/span&gt;; i &amp;lt; pdc1.Count; i++) {&lt;br&gt;
  &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(204, 120, 50);"&gt;if&lt;/span&gt; (typeMergerPolicy == &lt;span style="color: rgb(204, 120, 50);"&gt;null&lt;/span&gt; || !typeMergerPolicy.Ignored.Contains(pdc1[i].GetValue(values1)))&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;properties.Add(pdc1[i]);&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="color: rgb(128, 128, 128);"&gt;&lt;font color="#ffffff"&gt;&lt;font color="green"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;//add properties from values2&lt;/font&gt;&lt;br&gt;
  &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;for&lt;/span&gt; (&lt;span style="color: rgb(204, 120, 50);"&gt;int&lt;/span&gt; i = &lt;span style="color: rgb(104, 151, 187);"&gt;0&lt;/span&gt;; i &amp;lt; pdc2.Count; i++) {&lt;br&gt;
  &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(204, 120, 50);"&gt;if&lt;/span&gt; (typeMergerPolicy == &lt;span style="color: rgb(204, 120, 50);"&gt;null&lt;/span&gt; || !typeMergerPolicy.Ignored.Contains(pdc2[i].GetValue(values2)))&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;properties.Add(pdc2[i]);&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

  &lt;p style="color: rgb(128, 128, 128);"&gt;&lt;font color="#ffffff"&gt;&lt;font color="green"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;//return array&lt;/font&gt;&lt;br&gt;
  &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;return&lt;/span&gt; properties.ToArray();&lt;br&gt;
  }&lt;/font&gt;&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;/p&gt;

  &lt;p style="color: rgb(255, 255, 255);"&gt;&lt;font color="#ffffff"&gt;&lt;span style="color: rgb(204, 120, 50);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(204, 120, 50);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(255, 198, 109);"&gt;TypeMergerPolicy&lt;/span&gt; Ignore(&lt;span style="color: rgb(204, 120, 50);"&gt;object&lt;/span&gt; value)&lt;br&gt;
  {&lt;br&gt;
  &lt;span style="color: rgb(204, 120, 50);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;return&lt;/span&gt; &lt;span style="color: rgb(204, 120, 50);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(255, 198, 109);"&gt;TypeMergerPolicy&lt;/span&gt;(value);&lt;br&gt;
  }&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That's it! As you can see the TypeMerger.Ignore method kicks off the process and the TypeMergerPolicy.MergeTypes method finishes it off. Below is the full source with a simple unit test included. Please feel free to let me know what you think of the approach.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kylefinley.net/blogfiles/TypeMerger.zip" title="TypeMerger.zip"&gt;TypeMerger.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cheers,&lt;br&gt;
Kyle&lt;/p&gt;&lt;img src="http://kylefinley.net/aggbug.aspx?PostID=1339" width="1" height="1"&gt;</content><slash:comments>1</slash:comments><wfw:commentRss>http://kylefinley.net/commentrss.aspx?PostID=1339</wfw:commentRss></entry><entry><title>Build + Run MSpec</title><link rel="alternate" type="text/html" href="http://kylefinley.net/archive/2009/10/05/1337.aspx" /><id>c5cb4a99-bbac-452f-896a-397bc31c9b4b:1337</id><created>2009-10-06T01:00:31Z</created><content type="text/html" mode="escaped">&lt;p&gt;I hope to put together a full post on &lt;a href="http://github.com/machine/machine.specifications" title="MSpec" target="_blank"&gt;MSpec&lt;/a&gt; but until then check out Rob Conery's &lt;a href="http://blog.wekeroad.com/blog/make-bdd-your-bff-2/" title="Make BDD your BFF" target="_blank"&gt;Make BDD your BFF&lt;/a&gt; post (which I mostly agree with).&lt;/p&gt;
&lt;p&gt;If you're too lazy to click on Rob's post and still reading basically MSpec is &lt;a href="http://codebetter.com/blogs/aaron.jensen/" target="_blank"&gt;Aaron Jensen's&lt;/a&gt; twist on a BDD based testing framework that rides on top of a more full featured framework such as NUnit or xUnit. Some are calling this approach Context Specification over pure &lt;a href="http://dannorth.net/introducing-bdd" target="_blank"&gt;BDD as Dan North intended&lt;/a&gt; it but not going to go into my thoughts on all that here. That's the future post which I promise is coming...&lt;/p&gt;
&lt;p&gt;So WTF is this post all about then you may ask. Well if you haven't figured it out already it's a little helper goo you can toss in the VS mix to speed up life and reduce frustrations while using MSpec. Let me back up a little and explain why I did this. MSpec comes with the ability to tie &lt;a href="http://testdriven.net/" target="_blank"&gt;TestDriven.net&lt;/a&gt; in as the test runner for all your specs, which is a great thing fore sure! But as all of you know that use TD.net it isn't exactly the snappiest thing in the world. Aaron and crew included another test runner for MSpec which is considerably faster. The problem I kept having (and Rob Conery as well if you look back at his &lt;a href="http://blog.wekeroad.com/mvc-storefront/kona-3/" target="_blank"&gt;Kona Sreencast&lt;/a&gt;) was forgetting to build the project after making changes and then running the MSpec runner. What happens? Nothing, your old code runs. The solution didn't build so what would you expect.&lt;/p&gt;
&lt;p&gt;So what's the solution? I created a Macro that kicks off a solution build and uses the build events to then kick off the external command associated with the MSPec runner. First off you need to have MSpec setup as an external task for this to work (follow the steps on Rob's post above). Once you do that add in the following macro goodness.&lt;/p&gt;
&lt;p&gt;Drop this procedure in any of your personal macro modules (mind is called BDD)&lt;/p&gt;
&lt;div style="border: 1px solid black; padding: 5px; background-color: white; font-family: courier new;"&gt;
  &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Public&lt;/span&gt; runMSpecOnComplete &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Boolean&lt;/span&gt; = &lt;span style="color: rgb(0, 0, 255);"&gt;False&lt;/span&gt;&lt;/p&gt;

  &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;/span&gt; BuildAndRunMSpecForFocusedProject()&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DTE.ExecuteCommand(&lt;span style="color: rgb(163, 21, 21);"&gt;"Build.BuildSolution"&lt;/span&gt;)&lt;br&gt;
  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;runMSpecOnComplete = &lt;span style="color: rgb(0, 0, 255);"&gt;True&lt;/span&gt;&lt;/p&gt;

  &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;End Sub&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Add the following sub to the EnvirontmentEvents module included under MyMacros. (Note: BDD is the module the above code is located in)&lt;/p&gt;
&lt;div style="border: 1px solid black; padding: 5px; background-color: white; font-family: courier new;"&gt;
  &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Private&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;/span&gt; BuildEvents_OnBuildDone(&lt;span style="color: rgb(0, 0, 255);"&gt;ByVal&lt;/span&gt; Scope &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; EnvDTE.vsBuildScope, &lt;span style="color: rgb(0, 0, 255);"&gt;ByVal&lt;/span&gt; Action &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; EnvDTE.vsBuildAction) &lt;span style="color: rgb(0, 0, 255);"&gt;Handles&lt;/span&gt; BuildEvents.OnBuildDone&lt;/p&gt;

  &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;If&lt;/span&gt; (BDD.runMSpecOnComplete) &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br&gt;
  &lt;span style="color: rgb(0, 0, 0);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; BDD.runMSpecOnComplete = &lt;span style="color: rgb(0, 0, 255);"&gt;False&lt;br&gt;
  &lt;span style="color: rgb(0, 0, 0);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;DTE.ExecuteCommand(&lt;span style="color: rgb(163, 21, 21);"&gt;"Tools.ExternalCommand1"&lt;/span&gt;) &lt;span style="color: rgb(0, 128, 0);"&gt;'Where ExternalCommand1 matches the MSPec runner command&lt;br&gt;
  &lt;span style="color: rgb(0, 0, 0);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;DTE.Windows.Item(Constants.vsWindowKindOutput).Activate()&lt;br&gt;
  &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="color: rgb(0, 0, 255);"&gt;End Sub&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The last thing I do for more convenience is to associate the Macro with a toolbar button. If you're not sure how to do this just right click on any toolbar in the menus and select customize, on the Commands tab select Macros under Categories list, under the commands listing find the Macro you added the above code to, drag it to a location on the toolbar and drop. Once the command is there you can change the text and the icon. I personally put mine right next to the Play button and use the big Red Diamond. Now when I click on the button my solution builds and my Specs run.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://kylefinley.net/aggbug.aspx?PostID=1337" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://kylefinley.net/commentrss.aspx?PostID=1337</wfw:commentRss></entry><entry><title>Merlin Mann - &amp;quot;Toward Patterns for Creativity&amp;quot;</title><link rel="alternate" type="text/html" href="http://kylefinley.net/archive/2009/10/03/1335.aspx" /><id>c5cb4a99-bbac-452f-896a-397bc31c9b4b:1335</id><created>2009-10-03T23:13:02Z</created><content type="text/html" mode="escaped">&lt;p&gt;In case you haven't seen this I highly recommend watching it. Merlin Mann is the founder of &lt;a href="http://43folders.com" title="43folders.com" target="_blank"&gt;43folders.com&lt;/a&gt; and IMO has a good grasp on this being creative thing.&lt;/p&gt;
&lt;p&gt;&lt;object height="364" width="445"&gt;
  &lt;param name="movie" value="http://www.youtube.com/v/GExHiI_bQqc&amp;amp;hl=en&amp;amp;fs=1&amp;amp;border=1"&gt;
  &lt;param name="allowFullScreen" value="true"&gt;
  &lt;param name="allowscriptaccess" value="always"&gt;
  &lt;embed src="http://www.youtube.com/v/GExHiI_bQqc&amp;amp;hl=en&amp;amp;fs=1&amp;amp;border=1" type="application/x-shockwave-flash" height="364" width="445"&gt;
&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=GExHiI_bQqc" title="Oriinal Video" target="_blank"&gt;Original Video&lt;/a&gt;&lt;/p&gt;&lt;img src="http://kylefinley.net/aggbug.aspx?PostID=1335" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://kylefinley.net/commentrss.aspx?PostID=1335</wfw:commentRss></entry><entry><title>Mix 09 Presentation Videos and Slides</title><link rel="alternate" type="text/html" href="http://kylefinley.net/archive/2009/04/04/1207.aspx" /><id>c5cb4a99-bbac-452f-896a-397bc31c9b4b:1207</id><created>2009-04-04T20:18:40Z</created><content type="text/html" mode="escaped">&lt;p&gt;If you're like me and couldn't attend the &lt;a href="http://live.visitmix.com/" target="_blank"&gt;Mix 09&lt;/a&gt; conference you can still check out the presentations on your own.&amp;nbsp; The Mix crew has put up a list of all the presentations with the video and slides.&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;a title="http://videos.visitmix.com/MIX09/All" href="http://videos.visitmix.com/MIX09/All"&gt;http://videos.visitmix.com/MIX09/All&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Thanks guys!&lt;/p&gt;&lt;img src="http://kylefinley.net/aggbug.aspx?PostID=1207" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://kylefinley.net/commentrss.aspx?PostID=1207</wfw:commentRss></entry><entry><title>Slipstream Visual Studio 2008 Service Pack 1</title><link rel="alternate" type="text/html" href="http://kylefinley.net/archive/2009/04/03/1206.aspx" /><id>c5cb4a99-bbac-452f-896a-397bc31c9b4b:1206</id><created>2009-04-03T19:26:03Z</created><content type="text/html" mode="escaped">&lt;p&gt;During the rebuild of my development environment I wanted to use the same trick I used before to reduce the size of my chained differenced VHD files.  (For info on my setup check out &lt;a href="http://www.andrewconnell.com/blog/Default.aspx" target="_blank"&gt;Andrew Connell's&lt;/a&gt; &lt;a href="http://www.andrewconnell.com/blog/articles/UseVirtualPCsDifferencingDisksToYourAdvantage.aspx" target="_blank"&gt;HOWTO: Use Virtual PC's Differencing Disks to your Advantage&lt;/a&gt; post.)  I haven't had time to dive into this so I did a quick search to see if there would be any issues, unfortunately there is.&lt;/p&gt; &lt;p&gt;According to &lt;a href="http://blogs.msdn.com/heaths/" target="_blank"&gt;Heath Stewart&lt;/a&gt; slipstreaming Visual Studio 2008 sp1 is &lt;a href="http://social.msdn.microsoft.com/forums/en-us/vssetup/thread/987ed5a4-7392-4077-8090-4fafc26c9fa3?prof=required&amp;lc=1033" target="_blank"&gt;not supported&lt;/a&gt; except for Active Directory deployments.  Heath's recommendation is to perform an chained unattended install of VS 2k8 and SP1. If you're interested in this approach &lt;a href="http://blogs.msdn.com/astebner/archive/2006/05/04/590387.aspx" target="_blank"&gt;here&lt;/a&gt; is info on how to do this with VS 2k5, steps for VS 2k8 should be very similar.  This would allow you to silently install both Visual Studio and sp1 on a machine.  To address the disk space requirements for installing sp1 Heath recommends you disable the patch baseline cache using the &lt;a href="http://msdn.microsoft.com/en-us/library/aa369798(VS.85).aspx" target="_blank"&gt;MaxPatchCacheSize&lt;/a&gt; policy.  No doubt this option will work but it isn't exactly what I wanted.  Also keep in mind there could be issues using this approach, if you need to repair or uninstall a patch you will be &lt;a href="http://blogs.msdn.com/heaths/archive/2005/12/02/499495.aspx" target="_blank"&gt;prompted for the source&lt;/a&gt; files, which you won't have. Since the forum post implied that an AD deployment of a slipstreamed install &lt;em&gt;is&lt;/em&gt; supported I assumed this would still be possible so I wanted to give it a go.&lt;/p&gt; &lt;p&gt;As a starting point I looked back at &lt;a href="http://richardrudek.spaces.live.com/blog/" target="_blank"&gt;Richard Rudek's&lt;/a&gt; post on &lt;a href="http://richardrudek.spaces.live.com/blog/cns!8B65F3DE0BE797AA!185.entry" target="_blank"&gt;slipstreaming Visual Studio 2005 SP1&lt;/a&gt;.  As I expected the steps are just about the same but I ran into a little bit of a snag.  Creating the Administrative installation of VS was no problem.  When I applied the service pack to the admin install I received the following error.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;&lt;a href="http://kylefinley.net/blogpics/SlipstreamVisualStudio2008ServicePack1_D8FC/image.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="151" alt="image" src="/blogpics/SlipstreamVisualStudio2008ServicePack1_D8FC/image_thumb.png" width="375" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;A quick Google search led me to the &lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=362252" target="_blank"&gt;Bug&lt;/a&gt;.  Unfortunately the status for the bug is Closed (Won't Fix).  I searched the install folder for the WcfTestClient.chm file and found it in a different folder than where the service pack installer expected it to be, instead the file was in the Program Files\Microsoft Visual Studio 9.0\Common7\1033 folder.  To get around the error I simply copied the WcfTestClient.chm file from the Program Files\Microsoft Visual Studio 9.0\Common7\1033 folder to the Program Files\Microsoft Visual Studio 9.0\Common7\IDE folder and reran the service pack installer.  This time it ran with no errors!  Next finished out the steps in Richard's post (Step 4).  There were much more than 7 files prompted for overwriting, I didn't count the files but just hit N each time I was prompted.  Once the files finished copying I installed the slipstreamed Visual Studio installation on a fresh vm and it installed with no errors.  I checked the SP level of Visual Studio and it showed to be sp1.&lt;/p&gt; &lt;p&gt;Here ere are the commands I ran for each step:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;&lt;br&gt;msiexec.exe /a E:\vs_setup.msi TARGETDIR=F:\VS2k8 /L*vx F:\VS2k8\vsinstall.log&lt;/p&gt; &lt;p&gt;(Note: Copy WcfTestClient.chm file before running step 2)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;&lt;br&gt;VS90sp1-KB945140-ENU.exe /extract F:\VS2k8SP1\Extracted&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;&lt;br&gt;msiexec.exe /a F:\VS2k8\vs_setup.msi /p F:\VS2k8SP1\Extracted\VS90sp1-KB945140-X86-ENU.msp /L*vx F:\VS2k8\patch.log&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt;&lt;br&gt;xcopy E: /h /i /r /s /exclude:exclude.txt&lt;br&gt; &lt;p&gt;Once completed the slipstreamed installation folder is 4,490,358,390 bytes and contains 14,966 files with 1,543 folders.   &lt;p&gt;Hope this helps.&lt;/p&gt; &lt;p&gt;Cheers,&lt;br&gt;Kyle&lt;/p&gt;&lt;img src="http://kylefinley.net/aggbug.aspx?PostID=1206" width="1" height="1"&gt;</content><slash:comments>11</slash:comments><wfw:commentRss>http://kylefinley.net/commentrss.aspx?PostID=1206</wfw:commentRss></entry><entry><title>Resize VHD and Partition</title><link rel="alternate" type="text/html" href="http://kylefinley.net/archive/2009/04/03/1205.aspx" /><id>c5cb4a99-bbac-452f-896a-397bc31c9b4b:1205</id><created>2009-04-03T04:38:25Z</created><content type="text/html" mode="escaped">&lt;p&gt;Because of a little downtime I'm reworking my development environment.&amp;nbsp; For years I've been using Virtual PC and a differenced disk setup based on &lt;a href="http://www.andrewconnell.com/blog/Default.aspx" target="_blank"&gt;Andrew Connell's&lt;/a&gt; &lt;a href="http://www.andrewconnell.com/blog/articles/UseVirtualPCsDifferencingDisksToYourAdvantage.aspx" target="_blank"&gt;post&lt;/a&gt;.&amp;nbsp; The setup is great for spinning up a new development environment for new clients or for just an isolated development / testing environment.&lt;/p&gt; &lt;p&gt;I primarily use Windows 2003 R2 as my development OS.&amp;nbsp; The cool thing about this setup is I haven't had to install the OS for over 3 years!&amp;nbsp; The problem I've had though is that when I set this up I set the dynamic disk size for the Base VHD to 16GB.&amp;nbsp; This only becomes a problem when I use up the 16 gigs and start to run out of disk space.&amp;nbsp; There are several tricks you use to deal with this, the simplest is to create a separate VHD to install applications on, this way the differenced disk isn't used and space isn't eaten up on your VPC's C: drive.&lt;/p&gt; &lt;p&gt;So getting to the point...&amp;nbsp; In reworking my development environment I want to do a couple of things:&amp;nbsp; &lt;/p&gt; &lt;ol&gt; &lt;li&gt;Install latest OS patches  &lt;li&gt;Increase base VHD size&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;The first one is simple. The second one might seem a little tricky but luckily it's not.&amp;nbsp; &lt;/p&gt; &lt;p&gt;I searched around and found the &lt;a href="http://vmtoolkit.com/files/folders/converters/entry87.aspx" target="_blank"&gt;VHD Resizer utility&lt;/a&gt; from &lt;a href="http://vmtoolkit.com/" target="_blank"&gt;VMTooklit.com&lt;/a&gt;.&amp;nbsp; The tool allows you to select a VHD and increase the physical size of the disk.&amp;nbsp; I gave it a go and it worked like a charm.&amp;nbsp; Only one thing I didn't think about, it did increase the size of the VHD but not the partition on the VHD.&amp;nbsp; So basically this just gave me unallocated space on the disk.&amp;nbsp; Not what I wanted but I can work with this.&amp;nbsp; Time to put on my old sys admin hat.&amp;nbsp; Now I just needed to extend the primary partition to fill up the unallocated space.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Simplest way to do this is to use the built in &lt;a href="http://support.microsoft.com/kb/325590" target="_blank"&gt;diskpart.exe&lt;/a&gt; utility.&amp;nbsp; Only thing is you can't use it on a disk that is running.&amp;nbsp; No problem, just mount the VHD as a disk in another Virtual Machine and you're good to go.&amp;nbsp; Also just ask a tip this is a good way to defrag before precompacting the disk (use the -SetDisks option for precompact.exe to specify which disk to precompact).&lt;/p&gt; &lt;p&gt;After going through the steps I'm ready to start my chain of VHDs and now my base image is up to date, 50GB, and only 200MB larger on the disk. :)&lt;/p&gt; &lt;p&gt;Cheers,&lt;br&gt;Kyle&lt;/p&gt;&lt;img src="http://kylefinley.net/aggbug.aspx?PostID=1205" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://kylefinley.net/commentrss.aspx?PostID=1205</wfw:commentRss></entry><entry><title>Convert Office Files to 2k7 Format from Explorer Context Menu</title><link rel="alternate" type="text/html" href="http://kylefinley.net/archive/2009/03/10/1025.aspx" /><id>c5cb4a99-bbac-452f-896a-397bc31c9b4b:1025</id><created>2009-03-10T23:02:57Z</created><content type="text/html" mode="escaped">&lt;p&gt;A few months ago I thought of this.&amp;nbsp; I wanted an explorer add-in that would allow me to right click on an Office 2003 or earlier format document and convert it to an Office 2007 format.&amp;nbsp; I know you can simply open the file in its associated Office 2007 application and save as the newer format but this seemed like too much work for me.&amp;nbsp; I typically think of this situation when I go to email a file that is in the older format and think to myself "Gee if it was a 2k7 file it would be smaller."&lt;/p&gt;
&lt;p&gt;I started looking around and found that you could do this from code but there are also tools that Microsoft have provided to automate the bulk conversion of legacy Office files to the newer format.&amp;nbsp; Naturally I wanted to leverage the work they had already done if possible.&lt;/p&gt;
&lt;p&gt;My early searches led me to &lt;a href="http://blogs.msdn.com/ericwhite/" target="_blank"&gt;Eric White's&lt;/a&gt; post &lt;a href="http://blogs.msdn.com/ericwhite/archive/2008/09/19/bulk-convert-doc-to-docx.aspx" target="_blank"&gt;Bulk Convert DOC to DOCX&lt;/a&gt;.&amp;nbsp; This post pointed me to the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=13580cd7-a8bc-40ef-8281-dd2c325a5a81&amp;amp;DisplayLang=en" target="_blank"&gt;Microsoft Office Migration Planning Manager&lt;/a&gt;.&amp;nbsp; The OMPM consists of a number of things including utilities for bulk file conversion.&amp;nbsp; The one of interest to me was the Office File Converter utility (OFC.exe)&amp;nbsp; This tool seems to be great for bulk converting office files to the new 2007 format but that really isn't what I wanted to do. &lt;/p&gt;
&lt;p&gt;Fortunately I stumbled upon something posted on the &lt;a href="http://channel9.msdn.com/wiki/officedeployment/ompmcontributions/" target="_blank"&gt;OMPM contributions&lt;/a&gt; page that was promising.&amp;nbsp; It is possible to use the Office Compatibility Pack directly to convert legacy Office files individually to the new Office 2007 Open XML format.&amp;nbsp; In the Office Compatibility Pack there are individual utilities that convert files from the old format to the new format.&amp;nbsp; Apparently the OMPM actually calls these executables directly from the OFC.exe utility.&lt;/p&gt;
&lt;p&gt;Here are the individual commands for converting each type of file:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Word&lt;/b&gt; 
&lt;div style="border-right: black 1px solid; padding-right: 5px; border-top: black 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: black 1px solid; padding-top: 5px; border-bottom: black 1px solid; background-color: white"&gt;
&lt;p&gt;"C:\Program Files\Microsoft Office\Office12\wordconv.exe" -oice -nme &amp;lt;input file&amp;gt; &amp;lt;output file&amp;gt; &lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Excel&lt;/b&gt; 
&lt;div style="border-right: black 1px solid; padding-right: 5px; border-top: black 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: black 1px solid; padding-top: 5px; border-bottom: black 1px solid; background-color: white"&gt;
&lt;p&gt;"C:\Program Files\Microsoft Office\Office12\excelcnv.exe" -oice &amp;lt;input file&amp;gt; &amp;lt;output file&amp;gt; &lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;b&gt;PowerPoint&lt;/b&gt; 
&lt;div style="border-right: black 1px solid; padding-right: 5px; border-top: black 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: black 1px solid; padding-top: 5px; border-bottom: black 1px solid; background-color: white"&gt;
&lt;p&gt;"C:\Program Files\Microsoft Office\Office12\ppcnvcom.exe" -oice &amp;lt;input file&amp;gt; &amp;lt;output file&amp;gt; &lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Once I knew there was a way to convert files individually it was just a matter of adding it as an Action for each type of file.&amp;nbsp; The trick was passing the correct parameters to the executables.&amp;nbsp; I put together a little batch file that would allow me to pass in a few parameters and build the correct paths.&amp;nbsp; Save this file in the Windows directory.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ConvertO2k3to2k7.bat&lt;/b&gt;&amp;nbsp; &lt;div style="border-right: black 1px solid; padding-right: 5px; border-top: black 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: black 1px solid; padding-top: 5px; border-bottom: black 1px solid; background-color: white"&gt;
&lt;p&gt;"C:\Program Files\Microsoft Office\Office12\%2" -oice %3 %1 "%~$PATH:1x"&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The batch file takes three parameters.&amp;nbsp; The full path for the original Office 2k3 file, the executable to use for converting the file, and the third is the extra command line argument used for the wordconv.exe utility.&amp;nbsp; (This is a little kludgy but it works.)&lt;/p&gt;
&lt;p&gt;Again make sure you save this file in the Windows directory.&lt;/p&gt;
&lt;p&gt;Now for each type of file (doc, xls, and ppt) I add a new Action.&amp;nbsp; Here are the steps to create create the action for a Word File Type:&lt;/p&gt;
&lt;p&gt;1. In Explorer choose Tools -&amp;gt; Folder Options -&amp;gt; File Types&lt;/p&gt;
&lt;p&gt;2. Select the DOC File Type and click Advanced&lt;/p&gt;
&lt;p&gt;3. From the Edit File Type dialogue create a New Action&lt;/p&gt;
&lt;p&gt;4. For the Action type Convert to docx&lt;/p&gt;
&lt;p&gt;5. For the Application used to perform action type ConvertO2k3To2k7.bat "%1" wordconv.exe -nme &lt;/p&gt;
&lt;p&gt;The first parameter is the full file path for the file to perform the action on, which is passed as the first parameter to the Action.&amp;nbsp; The second parameter is the executable to use for the conversation, in this case wordconv.exe because we are working with a DOC file type.&amp;nbsp; The third is the extra command argument required by the wordconv.exe utility.&amp;nbsp; You will not need this for the ppt or xls utilities.&lt;/p&gt;
&lt;p&gt;Don't worry about selecting Use DDE, it will get selected automatically for you.&amp;nbsp; Not really sure why but it doesn't seem to matter.&lt;/p&gt; &lt;p&gt;6. Click OK to save the action. You will see the new 'Convert to docx' item in the Actions list as such:&lt;/p&gt; &lt;p&gt;&lt;a href="http://kylefinley.net/blogpics/ConvertOfficeFilesto2k7FormatfromExplore_101AA/image.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="302" alt="image" src="/blogpics/ConvertOfficeFilesto2k7FormatfromExplore_101AA/image_thumb.png" width="336" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;7. Click OK on the Edit File Type dialogue and then Close on the Folder Options dialogue.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;Once you have performed all the steps you will now see a 'Convert to docx' option in the context menu when you right click on a .doc file. After selecting the option a cmd window will appear while the file is being converted.&lt;/p&gt; &lt;p&gt;&lt;a href="http://kylefinley.net/blogpics/ConvertOfficeFilesto2k7FormatfromExplore_101AA/image_3.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="118" alt="image" src="/blogpics/ConvertOfficeFilesto2k7FormatfromExplore_101AA/image_thumb_3.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;It is possible to select multiple Office files of the same type and convert all of the selected items, however this spawns separate cmd windows for each file.  I have found this doesn't work after selecting a large number of files.  This option really only works best for single file conversion on the fly which is all I wanted if for.&lt;/p&gt; &lt;p&gt;Hope this is helpful for someone out there.  If there are any errors in the steps please feel free to ask questions.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;Cheers,&lt;br&gt;Kyle&lt;/p&gt;&lt;img src="http://kylefinley.net/aggbug.aspx?PostID=1025" width="1" height="1"&gt;</content><slash:comments>18</slash:comments><wfw:commentRss>http://kylefinley.net/commentrss.aspx?PostID=1025</wfw:commentRss></entry><entry><title>Agile Retrospectives: Making Good Teams Great!</title><link rel="alternate" type="text/html" href="http://kylefinley.net/archive/2009/02/09/943.aspx" /><id>c5cb4a99-bbac-452f-896a-397bc31c9b4b:943</id><created>2009-02-10T04:36:23Z</created><content type="text/html" mode="escaped">&lt;p&gt;I stumbled upon this the other day.&amp;nbsp; &lt;br&gt;Presentation by Diana Larsen &amp;amp; Esther Derby at Google.&lt;/p&gt;
&lt;p&gt;
Nice of them to put this up.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;
&lt;object height="364" width="445"&gt;&lt;param name="movie" value="http://www.youtube.com/v/qqtPZYigfNI&amp;amp;hl=en&amp;amp;fs=1&amp;amp;border=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/qqtPZYigfNI&amp;amp;hl=en&amp;amp;fs=1&amp;amp;border=1" type="application/x-shockwave-flash" height="364" width="445"&gt;&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.youtube.com/watch?v=qqtPZYigfNI"&gt;Original&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://kylefinley.net/aggbug.aspx?PostID=943" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://kylefinley.net/commentrss.aspx?PostID=943</wfw:commentRss></entry><entry><title>Export Visio to XAML</title><link rel="alternate" type="text/html" href="http://kylefinley.net/archive/2008/02/24/672.aspx" /><id>c5cb4a99-bbac-452f-896a-397bc31c9b4b:672</id><created>2008-02-24T22:42:13Z</created><content type="text/html" mode="escaped">&lt;p&gt;&lt;a href="http://blogs.msdn.com/saveenr/default.aspx" target="_blank"&gt;Saveen Reddy&lt;/a&gt; has posted a new version of his &lt;a href="http://www.codeplex.com/VisioExportToXAML" target="_blank"&gt;Export Visio to XAML&lt;/a&gt; tool on &lt;a href="http://www.codeplex.com/" target="_blank"&gt;CodePlex&lt;/a&gt;.&amp;nbsp; This tool is an add-in for Visio 2007 that exports the document to XAML for rendering with WPF.&amp;nbsp; The tool uses &lt;a href="http://www.ucaya.com/blog/" target="_blank"&gt;Thierry Bouquain's&lt;/a&gt; &lt;a href="http://www.ucaya.com/blog/CommentView,guid,1608c24a-bcdb-4031-b778-4b3ee397ea9d.aspx" target="_blank"&gt;svg to xaml&lt;/a&gt; converter.&lt;/p&gt; &lt;p&gt;I haven't tried it out yet but this could come in handy.&amp;nbsp; &lt;/p&gt;&lt;img src="http://kylefinley.net/aggbug.aspx?PostID=672" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://kylefinley.net/commentrss.aspx?PostID=672</wfw:commentRss></entry><entry><title>Slightly Odd Terms of Service Item</title><link rel="alternate" type="text/html" href="http://kylefinley.net/archive/2008/01/30/650.aspx" /><id>c5cb4a99-bbac-452f-896a-397bc31c9b4b:650</id><created>2008-01-30T19:10:49Z</created><content type="text/html" mode="escaped">&lt;p&gt;Today I went to view a webcast from Microsoft and realized I haven't watched one since using my new computer (I really should blog on that one. hah).&amp;nbsp; I had to install the Live Meeting client, no big deal.&amp;nbsp; While waiting for the download to finish I noticed one of the bullets in the terms of service.&amp;nbsp; As with most of Microsoft's free stuff it included the standard "As Is" notice.&amp;nbsp; But this one had an addition to the normal stuff.&amp;nbsp; Here is the bullet full wording:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;"The software is licensed "AS IS" without any warranty. You can recover from Microsoft only direct damages up to the greater of the amount you paid for the software/service or one dollar (US $1.00)."&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;So what's up with the $1.00 thing?&amp;nbsp; If I could actually get $1.00 for every item I've downloaded from Microsoft over the years I bet that would actually add up to a pretty decent amount of cash. Hmm.&amp;nbsp; I might have to keep this in mind for Christmas money next year. :)&lt;/p&gt;&lt;img src="http://kylefinley.net/aggbug.aspx?PostID=650" width="1" height="1"&gt;</content><slash:comments>3</slash:comments><wfw:commentRss>http://kylefinley.net/commentrss.aspx?PostID=650</wfw:commentRss></entry><entry><title>Done-Done</title><link rel="alternate" type="text/html" href="http://kylefinley.net/archive/2007/12/18/644.aspx" /><id>c5cb4a99-bbac-452f-896a-397bc31c9b4b:644</id><created>2007-12-19T00:31:51Z</created><content type="text/html" mode="escaped">&lt;p&gt;“Done-done, as a client defines it, means that the development team is done with the feature (specified, designed, coded, unit tested), and the customer is done with the feature (acceptance tested).” &lt;a href="http://www.itworldcanada.com/Pages/Docbase/ViewArticle.aspx?title=Offshore-and-agile&amp;amp;ID=idgml-c842d3a4-38b9-4244-8946-9333b6b4ea1d&amp;amp;lid=ee6" target="_blank"&gt;source&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;One of my favorite Agile terms.&amp;nbsp; And always a good state for a feature to be in.&lt;/p&gt;&lt;img src="http://kylefinley.net/aggbug.aspx?PostID=644" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://kylefinley.net/commentrss.aspx?PostID=644</wfw:commentRss></entry><entry><title>AJAX usage among .NET Developers</title><link rel="alternate" type="text/html" href="http://kylefinley.net/archive/2007/12/18/643.aspx" /><id>c5cb4a99-bbac-452f-896a-397bc31c9b4b:643</id><created>2007-12-18T23:25:06Z</created><content type="text/html" mode="escaped">&lt;p&gt;&lt;a href="http://codeclimber.net.nz/" target=new&gt;Simone Chiaretta&lt;/a&gt; has a survey up for .NET developers.&amp;nbsp; He is trying to gather some data on &lt;a href="http://codeclimber.net.nz/archive/2007/12/18/Ajax-usage-among-.NET-developers.aspx" target=new&gt;Ajax usage among .NET Developers&lt;/a&gt;. It's a short survey so fill it out if you have a minute.&amp;nbsp; This is being done based on a &lt;a href="http://codeclimber.net.nz/archive/2007/12/18/ASP.NET-Ajax-usage-floats-around-35.aspx" target=new&gt;previous survey&lt;/a&gt; that targeted all types of web developers.&amp;nbsp; Go fill it out so we can get some more sample data. 
&lt;p&gt;My team has been using one of the "other" categories for AJAX so I'm interested to see if it makes the list.&amp;nbsp; We have been using &lt;a href="http://www.tibco.com/devnet/gi/" target=new&gt;Tibco GI&lt;/a&gt; lately and have been very happy with it (Ahh, to live in a world with no PostBacks...&amp;nbsp; how bliss).&amp;nbsp; I'm hoping to find some time to start to integrate &lt;a href="http://asp.net/downloads/3.5-extensions/" target=new&gt;ASP.NET MVC&lt;/a&gt; with Tibco GI to see what that looks like.&amp;nbsp; Not promising anything but hopefully I'll get some blog posts about it in the next month or so.&lt;/p&gt;&lt;br&gt;
&lt;p&gt;Peace&lt;br&gt;Kyle&lt;/p&gt;&lt;img src="http://kylefinley.net/aggbug.aspx?PostID=643" width="1" height="1"&gt;</content><slash:comments>2</slash:comments><wfw:commentRss>http://kylefinley.net/commentrss.aspx?PostID=643</wfw:commentRss></entry></feed>
