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

<channel>
	<title>Alteridem Consulting &#187; Tips&#8217;n&#8217;Tricks</title>
	<atom:link href="http://www.alteridem.net/category/tips/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.alteridem.net</link>
	<description>Software by Design</description>
	<lastBuildDate>Thu, 02 Sep 2010 17:52:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Visual Studio 2010 Command Prompt Here</title>
		<link>http://www.alteridem.net/2010/09/02/visual-studio-2010-command-prompt-here/</link>
		<comments>http://www.alteridem.net/2010/09/02/visual-studio-2010-command-prompt-here/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 17:52:37 +0000</pubDate>
		<dc:creator>Robert Prouse</dc:creator>
				<category><![CDATA[Tips'n'Tricks]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://www.alteridem.net/2010/09/02/visual-studio-2010-command-prompt-here/</guid>
		<description><![CDATA[Real developers live on the command line. Way back in 1996, Microsoft released the Command Prompt Here Power Toy to ease their pain. Industrious developers who preferred the Visual Studio command prompt took it and adopted it to run a Visual Studio command prompt with all of the paths to Visual Studio and .NET tools [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 6px 6px; display: inline; border-top: 0px; border-right: 0px" title="CmdPrompt" border="0" alt="CmdPrompt" align="right" src="http://www.alteridem.net/wp-content/uploads/2010/09/CmdPrompt.png" width="310" height="296" /> Real developers live on the command line. Way back in 1996, Microsoft released the <a href="http://www.microsoft.com/windowsxp/downloads/powertoys/xppowertoys.mspx">Command Prompt Here Power Toy</a> to ease their pain. Industrious developers who preferred the Visual Studio command prompt took it and adopted it to run a Visual Studio command prompt with all of the paths to Visual Studio and .NET tools in the path.</p>
<p>In the fine, time honored tradition, I have continued to update with each new Visual Studio release and have finally done so for Visual Studio 2010.</p>
<p>To install, download, unzip and right click and install the INF file, it will add a “VS 2010 Cmd Prompt Here” menu item when you right click on a folder in Explorer. Clicking on the menu item will launch a DOS prompt in that directory with all of the Visual Studio and .NET paths set correctly.</p>
<ul>
<li><a href="http://www.alteridem.net/wp-content/uploads/2010/09/vsnet2010cmdhere_x86.zip">Visual Studio 2010 Command Prompt Here (x86)</a></li>
<li><a href="http://www.alteridem.net/wp-content/uploads/2010/09/vsnet2010cmdhere_x64.zip">Visual Studio 2010 Command Prompt Here (x64)</a></li>
</ul>
<p>This assumes that you have installed Visual Studio to the default directory on the C drive. If that is not the case, edit the INF file and change line 38 to the correct path for your installation.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alteridem.net/2010/09/02/visual-studio-2010-command-prompt-here/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The dangers of Macros</title>
		<link>http://www.alteridem.net/2010/07/21/the-dangers-of-macros/</link>
		<comments>http://www.alteridem.net/2010/07/21/the-dangers-of-macros/#comments</comments>
		<pubDate>Wed, 21 Jul 2010 15:02:44 +0000</pubDate>
		<dc:creator>Robert Prouse</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Tips'n'Tricks]]></category>

		<guid isPermaLink="false">http://www.alteridem.net/?p=65</guid>
		<description><![CDATA[Another developer came to me with a problem today that he couldn’t figure out. He couldn’t believe what he was seeing in the debugger and needed a second set of eyes. He had a line of code like the following; return max( eRetVal, GetNumber() ); While debugging, he noticed that he was stepping into the [...]]]></description>
			<content:encoded><![CDATA[<p>Another developer came to me with a problem today that he couldn’t figure out. He couldn’t believe what he was seeing in the debugger and needed a second set of eyes. He had a line of code like the following;</p>
<pre name="code" class="cpp">return max( eRetVal, GetNumber() );</pre>
<p>While debugging, he noticed that he was stepping into the GetNumber() method twice, and in his code, it had side-effects. We both puzzled over it for awhile. We looked at the disassembly and sure enough, it was getting called twice, but why? Then it hit me, <b>max</b> is a macro, not a function. If you go to the definition of <b>max</b>, you find;</p>
<pre name="code" class="cpp">#ifndef max
#define max(a,b)            (((a) &gt; (b)) ? (a) : (b))
#endif</pre>
<p>So, if you expand that macro out, the original code gets compiles as;</p>
<pre name="code" class="cpp">return (((eRetVal) &gt; (GetNumber()) ? (eRetVal) : (GetNumber());</pre>
<p>Once the macro is expanded, it is easy to see why the method is called twice. Obviously I have not being doing enough C++ lately. There was a time when I would have seen that immediately as it is the classic example, but I have been working in .NET so long now that I am forgetting all of the little ways that C++ can bite you.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alteridem.net/2010/07/21/the-dangers-of-macros/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Extending CopyHelper using Extension Methods</title>
		<link>http://www.alteridem.net/2008/07/22/extending-copyhelper-using-extension-methods/</link>
		<comments>http://www.alteridem.net/2008/07/22/extending-copyhelper-using-extension-methods/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 13:14:00 +0000</pubDate>
		<dc:creator>Robert Prouse</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Libraries]]></category>
		<category><![CDATA[Tips'n'Tricks]]></category>

		<guid isPermaLink="false">http://www.alteridem.net/?p=55</guid>
		<description><![CDATA[In my last two posts, I have been developing a small utility library to do the grunt work of copying data from an instance of one class to an instance of another type. The Copier class from my last post allows me to copy all public properties from one class to another class as long [...]]]></description>
			<content:encoded><![CDATA[<p>In my <a href="http://www.alteridem.net/2008/07/21/extending-copyhelper-using-generics/">last</a> <a href="http://www.alteridem.net/2008/07/09/method-to-copy-data-between-objects-of-different-types/">two</a> posts, I have been developing a small utility library to do the grunt work of copying data from an instance of one class to an instance of another type. The <a href="http://www.alteridem.net/2008/07/21/extending-copyhelper-using-generics/"><strong>Copier</strong></a> class from my last post allows me to copy all public properties from one class to another class as long as the properties have the same name and type. All that is done with one line of code;</p>
<div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:364d24c2-3f44-49d3-b077-d600fcaece3c" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter">Copier&lt;ICustomer&gt;.Copy( customer ).To&lt;ICustomerView&gt;( view );</pre>
</div>
<p>Today, I am going to use extension methods to simplify the above code even further. I want to be able to write</p>
<div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:37699e1e-1b46-4f94-a84f-25266f64cba3" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter">customer.CopyTo&lt;ICustomerView&gt;( view );</pre>
</div>
<p>or if we want to rely on type inferencing with the generic <strong>CopyTo</strong> method, you could write it as simply as</p>
<div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:9c627046-fca3-4dc8-8ad8-df7c27291361" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter">customer.CopyTo( view );</pre>
</div>
<p>How is this done? Using extension methods, it was actually much simpler than yesterday’s <a href="http://www.alteridem.net/2008/07/21/extending-copyhelper-using-generics/"><strong>Copier</strong></a> class. In fact, it just ended up being one line of code for the <strong>CopyTo</strong> method and for the <strong>CopyFrom</strong> method. I simply wrapped the <a href="http://www.alteridem.net/2008/07/09/method-to-copy-data-between-objects-of-different-types/"><strong>CopyHelper</strong></a> class like this.</p>
<div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d57cca66-24bc-4e64-a84a-3b52c1c5ebb6" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#">public static class CopierExtensions
{
    public static void CopyTo&lt;T&gt;( this object from, T to ) where T : class
    {
        CopyHelper.Copy( from.GetType(), from, typeof( T ), to );
    }

    public static void CopyFrom&lt;T&gt;( this object to, T from ) where T : class
    {
        CopyHelper.Copy( typeof( T ), from, to.GetType(), to );
    }
}</pre>
</div>
<p>The only problem I have with this is that the class that the extension methods are applied to are not constrained by an interface, so all matching properties are copied. Does anyone have any ideas on that?</p>
<p>I have uploaded a copy of <a href="http://www.alteridem.net/wp-content/uploads/2008/07/modelviewhelpers.zip">the solution for this project</a> along with an <a href="http://www.nunit.org">NUnit</a> test project. Take a look, use it if you like and feel free to give me suggestions for improvements.</p>
<p>In the next few posts I was thinking of extending these classes even further. I might add attributes that allow you to ignore certain properties, maybe add an attribute that specifies interfaces that you are allowed to copy to, possibly an attribute that allows properties to automatically be converted between types. What would you find useful or like to see? Would you like to see a post on the performance using these methods?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alteridem.net/2008/07/22/extending-copyhelper-using-extension-methods/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Extending CopyHelper using Generics</title>
		<link>http://www.alteridem.net/2008/07/21/extending-copyhelper-using-generics/</link>
		<comments>http://www.alteridem.net/2008/07/21/extending-copyhelper-using-generics/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 15:33:55 +0000</pubDate>
		<dc:creator>Robert Prouse</dc:creator>
				<category><![CDATA[.NET 2.0]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Libraries]]></category>
		<category><![CDATA[Tips'n'Tricks]]></category>

		<guid isPermaLink="false">http://www.alteridem.net/2008/07/21/extending-copyhelper-using-generics/</guid>
		<description><![CDATA[In my last post, I created a method that does the grunt work of copying data from an instance of one class to an instance of another type. I often find myself copying data between the properties of my data layer classes and those of my user interface like this. // Copy the data from [...]]]></description>
			<content:encoded><![CDATA[<p>In my <a href="http://www.alteridem.net/2008/07/09/method-to-copy-data-between-objects-of-different-types/">last post</a>, I created a method that does the grunt work of copying data from an instance of one class to an instance of another type. I often find myself copying data between the properties of my data layer classes and those of my user interface like this.</p>
</p>
<div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d56ee549-681a-47e3-98f2-b8699e660de1" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter">// Copy the data from the customer to the view
view.Address = customer.Address;
view.Country = customer.Country;
view.FirstName = customer.FirstName;
view.LastName = customer.LastName;
view.PostalCode = customer.PostalCode;
view.Province = customer.Province;</pre>
</div>
<p>The newly created <a href="http://www.alteridem.net/2008/07/09/method-to-copy-data-between-objects-of-different-types/"><strong>CopyHelper</strong> class</a> allows me to shorten that to this.</p>
<div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:106cd999-9de2-4404-bfe0-d08445cb28ca" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter">// Copy the data from the customer to the view (using reflection in .NET 1.x)
CopyHelper.Copy( typeof(ICustomer), customer, typeof(ICustomerView), view );</pre>
</div>
<p>Today, I want to extend that code using Generics and a <a href="http://en.wikipedia.org/wiki/Fluent_interface">fluent interface</a> so that I can write code like this.</p>
<div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:21d2f05d-c92d-4fc4-a163-9687494dddde" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter">// Copy the data from the customer to the view (using reflection and generics in .NET 2.0)
Copier&lt;ICustomer&gt;.Copy( customer ).To&lt;ICustomerView&gt;( view );</pre>
</div>
</p>
<p>Internally, I use my <a href="http://www.alteridem.net/2008/07/09/method-to-copy-data-between-objects-of-different-types/"><strong>CopyHelper</strong> class</a> from my last post. I extend that by creating a generic <strong>Copier</strong> class. I make the constructor private so that it can only be created as a part of the fluent interface, in this case the static copy method. Using the instance of the <strong>Copier</strong> class that was returned from that method, you can then copy <strong>To</strong> or <strong>From</strong> another class instance.</p>
<p>Here is the code.</p>
<div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e4d4e61e-e527-494e-b96d-0d4b4f9ba5ea" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#">public sealed class Copier&lt;T1&gt; where T1 : class
{
    #region Private Members

    private readonly T1 _subject;

    #endregion

    #region Public Interface

    /// &lt;summary&gt;
    /// Begin the copying process.
    /// &lt;/summary&gt;
    /// &lt;param name="interface1"&gt;The object you are copying from or to&lt;/param&gt;
    /// &lt;returns&gt;An instance of the Copier class so that you can
    /// continue with the copy to/from in a fluent interface.&lt;/returns&gt;
    public static Copier&lt;T1&gt; Copy( T1 interface1 )
    {
        return new Copier&lt;T1&gt;( interface1 );
    }

    #endregion

    #region Construction

    /// &lt;summary&gt;
    /// Private constructor so that it can only be created as a part of a fluent interface.
    /// &lt;/summary&gt;
    /// &lt;param name="subject"&gt;&lt;/param&gt;
    private Copier( T1 subject )
    {
        _subject = subject;
    }

    #endregion

    #region Copier Methods

    /// &lt;summary&gt;
    /// Copies properties from the subject to the passed in object.
    /// &lt;/summary&gt;
    /// &lt;typeparam name="T2"&gt;The type of object you are copying into.&lt;/typeparam&gt;
    /// &lt;param name="to"&gt;The object to copy into.&lt;/param&gt;
    /// &lt;returns&gt;The modified object that you passed in.&lt;/returns&gt;
    public T2 To&lt;T2&gt;( T2 to ) where T2 : class
    {
        CopyHelper.Copy( typeof( T1 ), _subject, typeof( T2 ), to );
        return to;
    }

    /// &lt;summary&gt;
    /// Copies properties from the passed in object into the subject.
    /// &lt;/summary&gt;
    /// &lt;typeparam name="T2"&gt;The type of object you are copying from.&lt;/typeparam&gt;
    /// &lt;param name="from"&gt;The object to copy from.&lt;/param&gt;
    /// &lt;returns&gt;The modified subject that you originally passed in the Copy method.&lt;/returns&gt;
    public T1 From&lt;T2&gt;( T2 from ) where T2 : class
    {
        CopyHelper.Copy( typeof( T2 ), from, typeof( T1 ), _subject );
        return _subject;
    }

    #endregion
}</pre>
</div>
</p>
<p>I would like to constrain <strong>T1</strong> and <strong>T2</strong> to interfaces at compile time, but I am not sure if that can be done. If you have ideas, please post them in the comments. I thought of using reflection to check if <strong>T1</strong> and <strong>T2</strong> are interfaces at run time, but I am a big believer in favouring compile time errors over run time errors.</p>
<p>In my <a href="http://www.alteridem.net/2008/07/22/extending-copyhelper-using-extension-methods/">next post</a>, I am going to use C# 3.0 extension methods to further simplify copying allowing you to write code like this.</p>
<div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:acf0083b-b819-41ac-801c-41c0f977934e" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter">// Copy the data from the customer to the view (using extension methods in C# 3.0)
customer.CopyTo&lt;ICustomerView&gt;( view );</pre>
</div>
<p>I am very interested in hearing your feedback on this, so be sure to post to the comments. Do you think this is a good idea? Do you have suggestions for improvements? Let me know.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alteridem.net/2008/07/21/extending-copyhelper-using-generics/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Method to Copy Data Between Objects of Different Types</title>
		<link>http://www.alteridem.net/2008/07/09/method-to-copy-data-between-objects-of-different-types/</link>
		<comments>http://www.alteridem.net/2008/07/09/method-to-copy-data-between-objects-of-different-types/#comments</comments>
		<pubDate>Wed, 09 Jul 2008 16:05:00 +0000</pubDate>
		<dc:creator>Robert Prouse</dc:creator>
				<category><![CDATA[.NET 1.x]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Tips'n'Tricks]]></category>

		<guid isPermaLink="false">http://www.alteridem.net/2008/07/09/method-to-copy-data-between-objects-of-different-types/</guid>
		<description><![CDATA[One thing that I find tiresome when using the various Model/View patterns is the constant copying of data between the model and the view. Too often, I find myself writing code like this to copy data between an ICustomer and an ICustomerView; // Copy the data from the customer to the view view.Address = customer.Address; [...]]]></description>
			<content:encoded><![CDATA[<p>One thing that I find tiresome when using the various <a href="http://polymorphicpodcast.com/shows/mv-patterns/">Model/View patterns</a> is the constant copying of data between the model and the view. Too often, I find myself writing code like this to copy data between an <strong>ICustomer</strong> and an <strong>ICustomerView</strong>;</p>
<p><a name="listing1"></a></p>
<div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:2ee7dfba-ed37-4b8e-9881-03d732dd1547" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter">// Copy the data from the customer to the view
view.Address = customer.Address;
view.Country = customer.Country;
view.FirstName = customer.FirstName;
view.LastName = customer.LastName;
view.PostalCode = customer.PostalCode;
view.Province = customer.Province;</pre>
</div>
<p>I would much rather write something like one of the following lines;</p>
<p><a name="listing2"></a></p>
<div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d4534127-22e3-47de-9638-6bc33333d17b" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#">// Copy the data from the customer to the view (using reflection in .NET 1.x)
CopyHelper.Copy( typeof(ICustomer), customer, typeof(ICustomerView), view );

// Copy the data from the customer to the view (using reflection and generics in .NET 2.0)
Copier&lt;ICustomer&gt;.Copy( customer ).To&lt;ICustomerView&gt;( view );

// Copy the data from the customer to the view (using extension methods in C# 3.0)
customer.CopyTo&lt;ICustomerView&gt;( view );</pre>
</div>
<p>It got me to thinking that there must be a better way, so I began writing code that would do the grunt work for me. Too often,</p>
<p>Over the next few days, I will blog about my thought process in developing this method and take it through the various iterations that can be seen in lines 2, 5 &amp; 8 above.</p>
<p>Today, I will start with the .NET 1.x version. I will start with some design decisions;</p>
<ul>
<li>I want to be able to specify the types that I am copying between, not infer them using reflection. This way, I can use the interfaces, not the concrete classes when I am copying between the objects. </li>
<li>For now, I am going to assume that if both interfaces have a non-static get/set property with the same <strong>name</strong> and <strong>type</strong> I will copy between them. </li>
<li>I need to check that neither object is null and that I am not trying to copy an object over to itself. </li>
</ul>
<p>This was simple enough. I created a static helper class called <strong>CopyHelper</strong> with one static <strong>Copy</strong> method. I use <a href="http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx">Type.GetProperties</a> to get the non-static, public properties with getters and setters. If the name and type match, I use the <a href="http://msdn.microsoft.com/en-us/library/b05d59ty.aspx">GetValue</a> and <a href="http://msdn.microsoft.com/en-us/library/xb5dd1f1.aspx">SetValue</a> methods on the <a href="http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.aspx">PropertyInfo</a> class to copy the value across from one object to the next. This is the result;</p>
<p><a name="listing3"></a></p>
<div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:c3141718-afd0-45c0-af12-a896a062b949" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#">#region Copyright © Alteridem Consulting 2008
//
// All rights are reserved. Reproduction or transmission in whole or in part, in
// any form or by any means, electronic, mechanical or otherwise, is prohibited
// without the prior written consent of the copyright owner.
//
// Filename: CopyHelper.cs
// Date:     06/06/2008 11:18 AM
// Author:   Rob Prouse
//
#endregion

#region Using Directives

using System;
using System.Collections.Generic;
using System.Reflection;

#endregion

namespace Alteridem.ModelViewHelpers
{
    public static class CopyHelper
    {
        #region Private Members

        // We are interested in non-static, public properties with getters and setters
        private const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.SetProperty;

        #endregion

        /// &lt;summary&gt;
        /// Copies all public properties from one object to another.
        /// &lt;/summary&gt;
        /// &lt;param name="fromType"&gt;The type of the from object, preferably an interface. We could infer this using reflection, but this allows us to contrain the copy to an interface.&lt;/param&gt;
        /// &lt;param name="from"&gt;The object to copy from&lt;/param&gt;
        /// &lt;param name="toType"&gt;The type of the to object, preferably an interface. We could infer this using reflection, but this allows us to contrain the copy to an interface.&lt;/param&gt;
        /// &lt;param name="to"&gt;The object to copy to&lt;/param&gt;
        public static void Copy( Type fromType, object from, Type toType, object to )
        {
            if ( fromType == null )
                throw new ArgumentNullException( "fromType", "The type that you are copying from cannot be null" );

            if ( from == null )
                throw new ArgumentNullException( "from", "The object you are copying from cannot be null" );

            if ( toType == null )
                throw new ArgumentNullException( "toType", "The type that you are copying to cannot be null" );

            if ( to == null )
                throw new ArgumentNullException( "to", "The object you are copying to cannot be null" );

            // Don't copy if they are the same object
            if ( !ReferenceEquals( from, to ) )
            {
                // Get all of the public properties in the toType with getters and setters
                Dictionary&lt;string, PropertyInfo&gt; toProperties = new Dictionary&lt;string, PropertyInfo&gt;();
                PropertyInfo[] properties = toType.GetProperties( flags );
                foreach ( PropertyInfo property in properties )
                {
                    toProperties.Add( property.Name, property );
                }

                // Now get all of the public properties in the fromType with getters and setters
                properties = fromType.GetProperties( flags );
                foreach ( PropertyInfo fromProperty in properties )
                {
                    // If a property matches in name and type, copy across
                    if ( toProperties.ContainsKey( fromProperty.Name ) )
                    {
                        PropertyInfo toProperty = toProperties[fromProperty.Name];
                        if ( toProperty.PropertyType == fromProperty.PropertyType )
                        {
                            object value = fromProperty.GetValue( from, null );
                            toProperty.SetValue( to, value, null );
                        }
                    }
                }
            }
        }
    }
}</pre>
</div>
<p>Using this <a href="#listing3">class</a>, you can now write code like in <a href="#listing2">line 2 of the second listing</a> above. In my <a href="http://www.alteridem.net/2008/07/21/extending-copyhelper-using-generics/">next post</a>, I am going to extend this code using generics and give it a <a href="http://en.wikipedia.org/wiki/Fluent_interface">fluent interface</a> for better readability.</p>
<p>I am very interested in hearing your feedback on this, so be sure to post to the comments. Do you think this is a good idea? Do you have suggestions for improvements? Let me know.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alteridem.net/2008/07/09/method-to-copy-data-between-objects-of-different-types/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Visual Studio Macro to switch between CPP and H files</title>
		<link>http://www.alteridem.net/2008/02/26/visual-studio-macro-to-switch-between-cpp-and-h-files/</link>
		<comments>http://www.alteridem.net/2008/02/26/visual-studio-macro-to-switch-between-cpp-and-h-files/#comments</comments>
		<pubDate>Tue, 26 Feb 2008 15:30:02 +0000</pubDate>
		<dc:creator>Robert Prouse</dc:creator>
				<category><![CDATA[Tips'n'Tricks]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://www.alteridem.net/2008/02/26/visual-studio-macro-to-switch-between-cpp-and-h-files/</guid>
		<description><![CDATA[I&#8217;ve been doing a lot of managed C++ programming lately and I had forgotten what a pain it is switching back and forth between the header file and source file.&#160; Back in the days of Visual Studio 6 I had a macro that switched between the CPP and H file, so I went googling, but [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been doing a lot of managed C++ programming lately and I had forgotten what a pain it is switching back and forth between the header file and source file.&nbsp; Back in the days of Visual Studio 6 I had a macro that switched between the CPP and H file, so I went googling, but the macro I <a href="http://www.codeguru.com/cpp/v-s/devstudio_macros/article.php/c3093/">found</a> didn&#8217;t work very well in VS2008.&nbsp; Like any good coder, I decided to write it myself instead.</p>
<p>If you haven&#8217;t written a macro before, here are the steps.</p>
<ol>
<li>In Visual Studio, go to <strong>Tools | Macros | Macros IDE</strong>. A new window should open and in the Project Explorer, the MyMacros project should be open.
<li>Right click on the <em>MyMacros</em> project and select <strong>Add | Add Module</strong>. Name it <em>CppUtilities</em>.&nbsp; The <em>CppUtilities</em> should open in the editor window.
<li>Add the code from below into the module and save the project.</li>
</ol>
<pre name="code" class="vb:nogutter">
‘=====================================================================
‘ If the currently open document is a CPP or an H file, attempts to
‘ switch between the CPP and the H file.
‘=====================================================================
Public Sub SwitchBetweenSourceAndHeader()
  Dim currentDocument As String
  Dim targetDocument As String

  currentDocument = ActiveDocument.FullName

  If currentDocument.EndsWith(“.cpp”, StringComparison.InvariantCultureIgnoreCase) Then
    targetDocument = Left(currentDocument, Len(currentDocument) - 3) + “h”
    OpenDocument(targetDocument)
  ElseIf currentDocument.EndsWith(“.h”, StringComparison.InvariantCultureIgnoreCase) Then
    targetDocument = Left(currentDocument, Len(currentDocument) - 1) + “cpp”
    OpenDocument(targetDocument)
  End If

End Sub

‘=====================================================================
‘ Given a document name, attempts to activate it if it is already open,
‘ otherwise attempts to open it.
‘=====================================================================
Private Sub OpenDocument(ByRef documentName As String)
  Dim document As EnvDTE.Document
  Dim activatedTarget As Boolean
  activatedTarget = False

  For Each document In Application.Documents
    If document.FullName = documentName And document.Windows.Count &gt; 0 Then
      document.Activate()
      activatedTarget = True
      Exit For
    End If
  Next
  If Not activatedTarget Then
    Application.Documents.Open(documentName, “Text”)
  End If
End Sub
</pre>
<p>If you switch back to Visual Studio and open the Macro Explorer, you should see the new module <em>CppUtilities</em> and the new macro <em>SwitchBetweenSourceAndHeader</em> in the tree.&nbsp; You could run the macro from here, but it is much easier to bind it to a keystroke.</p>
<ol>
<li>Click on <strong>Tools | Options</strong> then go to the <strong>Environment | Keyboard</strong> tab.</li>
<li>In the <strong>Show commands containing: </strong>box, type <em>CppUtilities.</em> This should filter the list down to one entry, <em>Macros.MyMacros.CppUtilitities.SwitchBetweenSourceAndHeader</em>.</li>
<li>Click on the <strong>Press shortcut keys:</strong> text box and then press the keystroke you would like to use to run the macro. If the keystroke is already used, it will show you below in the <strong>Shortcut currently used by:</strong> dropdown.&nbsp; When you find one that is unused, click the <strong>Assign</strong> button to use it.&nbsp; I use <strong>Ctrl+Shift+Alt+Bkspce</strong>.</li>
<li>Click <strong>OK</strong> then open a CPP or H file and give it a try.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.alteridem.net/2008/02/26/visual-studio-macro-to-switch-between-cpp-and-h-files/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>The Stopwatch Class in .NET</title>
		<link>http://www.alteridem.net/2008/01/14/the-stopwatch-class-in-net/</link>
		<comments>http://www.alteridem.net/2008/01/14/the-stopwatch-class-in-net/#comments</comments>
		<pubDate>Mon, 14 Jan 2008 20:13:21 +0000</pubDate>
		<dc:creator>Robert Prouse</dc:creator>
				<category><![CDATA[.NET 2.0]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Tips'n'Tricks]]></category>

		<guid isPermaLink="false">http://www.alteridem.net/2008/01/14/the-stopwatch-class-in-net/</guid>
		<description><![CDATA[Do you ever find yourself using DateTime to time a section of code?&#160; Do you have code like the following? DateTime start = DateTime.Now; // Perform a long process Thread.Sleep( 1968 ); DateTime end = DateTime.Now; TimeSpan duration = end.Subtract( start ); Console.WriteLine( "This process took {0} ms", duration.TotalMilliseconds ); If you do, you should [...]]]></description>
			<content:encoded><![CDATA[<p>Do you ever find yourself using <strong>DateTime</strong> to time a section of code?&nbsp; Do you have code like the following?</p>
<pre class="code">  <span style="color: rgb(128,0,128)">DateTime</span> start <span style="color: rgb(255,0,0)">=</span> <span style="color: rgb(128,0,128)">DateTime</span><span style="color: rgb(255,0,0)">.</span>Now;

  <span style="color: rgb(0,128,0)">// Perform a long process
</span>   <span style="color: rgb(43,145,175)">Thread</span><span style="color: rgb(255,0,0)">.</span>Sleep( <span style="color: rgb(128,0,128)">1968</span> );

  <span style="color: rgb(128,0,128)">DateTime</span> end <span style="color: rgb(255,0,0)">=</span> <span style="color: rgb(128,0,128)">DateTime</span><span style="color: rgb(255,0,0)">.</span>Now;
  <span style="color: rgb(128,0,128)">TimeSpan</span> duration <span style="color: rgb(255,0,0)">=</span> end<span style="color: rgb(255,0,0)">.</span>Subtract( start );
  <span style="color: rgb(43,145,175)">Console</span><span style="color: rgb(255,0,0)">.</span>WriteLine( <span style="color: rgb(163,21,21)">"This process took {0} ms"</span>,
    duration<span style="color: rgb(255,0,0)">.</span>TotalMilliseconds );</pre>
<p>If you do, you should look at the <strong><a href="http://msdn2.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx">System.Diagnostics.Stopwatch</a></strong> class that was introduced in the 2.0 framework.&nbsp; You can convert the code above to the much more readable</p>
<pre class="code">  <span style="color: rgb(43,145,175)">Stopwatch</span> stopwatch <span style="color: rgb(255,0,0)">=</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(43,145,175)">Stopwatch</span>();
  stopwatch<span style="color: rgb(255,0,0)">.</span>Start();

  <span style="color: rgb(0,128,0)">// Perform a long process
</span>  <span style="color: rgb(43,145,175)">Thread</span><span style="color: rgb(255,0,0)">.</span>Sleep( <span style="color: rgb(128,0,128)">1968</span> );

  stopwatch<span style="color: rgb(255,0,0)">.</span>Stop();
  <span style="color: rgb(43,145,175)">Console</span><span style="color: rgb(255,0,0)">.</span>WriteLine( <span style="color: rgb(163,21,21)">"This process took {0} ms"</span>,
    stopwatch<span style="color: rgb(255,0,0)">.</span>ElapsedMilliseconds );</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.alteridem.net/2008/01/14/the-stopwatch-class-in-net/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Quickly Find/Open a File in Visual Studio</title>
		<link>http://www.alteridem.net/2007/09/11/quickly-findopen-a-file-in-visual-studio/</link>
		<comments>http://www.alteridem.net/2007/09/11/quickly-findopen-a-file-in-visual-studio/#comments</comments>
		<pubDate>Tue, 11 Sep 2007 20:02:57 +0000</pubDate>
		<dc:creator>Robert Prouse</dc:creator>
				<category><![CDATA[Tips'n'Tricks]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://www.alteridem.net/2007/09/11/quickly-findopen-a-file-in-visual-studio/</guid>
		<description><![CDATA[Here is a cool Visual Studio feature that almost nobody knows about. If you want to open up a file in your solution, but can&#8217;t be bothered to dig down through your projects and folders to find it, try this, Click in the Find box in the toolbar, Type &#62;of followed by a space, then [...]]]></description>
			<content:encoded><![CDATA[<p>Here is a cool Visual Studio feature that almost nobody knows about. If you want to open up a file in your solution, but can&#8217;t be bothered to dig down through your projects and folders to find it, try this,</p>
<ol>
<li>Click in the Find box in the toolbar,
<li>Type &gt;of followed by a space, then begin the name of the file you are looking for.
<li>An auto-complete drop down will appear as you type filtering all the files in all your projects in your solution. Continue typing until the list is short enough to fine the one you want. Select it and hit enter.
<li>The file will open in the editor.</li>
</ol>
<div align="center"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="218" alt="openfile" src="http://www.alteridem.net/wp-content/uploads/2007/09/openfile.png" width="265" border="0"></div>
<p><b>Update:</b> After this post made the front page of <a href="http://www.dotnetkicks.com/">DotNetKicks</a>, Aaron Lerch wrote a <a href="http://www.aaronlerch.com/blog/2007/09/11/the-talented-mr-editgotofindcombo/">great post</a> on his blog with more things that you can do with the find combo. One thing that is very useful is that with the <strong>></strong>, you can issue any command, the alias <strong>>of</strong> mentioned here is just one of many. For a list of the commands, check out <a href="http://msdn2.microsoft.com/en-us/library/c3a0kd3x(VS.80).aspx">this MSDN page</a>.</p>
<p>Another useful tip is that <strong>Ctrl+D</strong> or <strong>Ctrl+/</strong> will automatically jump to the find box, so your hands don&#8217;t even need to leave your keyboard.</p>
<p><b>Update:</b> This trick was also mentioned on Just Sayin More Words as a part of his <a href="http://john-sheehan.com/blog/index.php/stupid-visual-studio-trick-part-3/">Stupid Visual Studio Trick</a> series. Thanks.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alteridem.net/2007/09/11/quickly-findopen-a-file-in-visual-studio/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
	</channel>
</rss>
