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