Può essere utile poter copiare le proprietà fra oggetti di tipo diverso utilizzando la Reflection. Di seguito una semplice funzione generica che copia le proprietà di nome e di tipo uguale che possono essere lette sull'oggetto di origine e scritte su quello di destinazione. 
    public static class ReflectionUtils
    {
        ... 
        public static void CopyTo(object Source, object Dest)
        {
            if(Source==null)
            {
                throw new ArgumentException("Source cannot be null.", "Source");
            }
 
            if (Dest == null)
            {
                throw new ArgumentException("Dest cannot be null.", "Dest");
            }
 
            Type typeSource = Source.GetType();
            Type typeDest = Dest.GetType();
            PropertyInfo[] propertyInfoColl = typeSource.GetProperties();
            foreach (PropertyInfo info in propertyInfoColl)
            {
                if (info.CanRead)
                {
                   PropertyInfo infoDest = typeDest.GetProperty(info.Name);
                   if ((infoDest != null) && (infoDest.CanWrite) &&
                       (infoDest.PropertyType == info.PropertyType))
 
                   {
                        infoDest.SetValue(Dest, info.GetValue(Source, null), null);
                   }
                }
            }
 
        }
    }
 
In pratica può essere utile per fare copie tra oggetti di tipo diverso oppure provenienti da modelli di dominio basati su architetture e/o librerie differenti.
Di seguito riporto un semplice esempio di utilizzo della funzione attraverso un test case.
    public class TavoloRotondo
    {
        public uint Altezza { get; set; }
        public uint Gambe { get; set; }
        public uint Raggio { get; set; }
    }
 
    public class TavoloQuadrato
    {
        public uint Altezza { get; set; }
        public uint Gambe { get; set; }
        public uint Larghezza { get; set; }
        public uint Lunghezza { get; set; }
    }
 
    [TestFixture]
    public class TestReflectionUtils
    {
        ... 
        [Test]
        public void TestSimpleCopyByReflection()
        {
            TavoloQuadrato tavoloQuadrato = new TavoloQuadrato()
            {
                Altezza = 120,
                Larghezza = 200,
                Lunghezza = 100,
                Gambe = 4
            };
 
            TavoloRotondo tavoloRotondo = new TavoloRotondo()
            {
                Raggio = 100,
            };
 
            ReflectionUtils.CopyTo(tavoloQuadrato, tavoloRotondo);
 
            Assert.AreEqual(tavoloQuadrato.Altezza, tavoloRotondo.Altezza);
            Assert.AreEqual(tavoloQuadrato.Gambe, tavoloRotondo.Gambe);
        }
    }