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);

        }

    }