public static TTarget MapTo<TSource, TTarget>(TSource aSource) where TTarget : new()
{
const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic;
TTarget aTarget = new TTarget();
Hashtable sourceData = new Hashtable();
foreach (PropertyInfo pi in aSource.GetType().GetProperties(flags))
{
if (pi.CanRead)
{
sourceData.Add(pi.Name, pi.GetValue(aSource, null));
}
}
foreach (PropertyInfo pi in aTarget.GetType().GetProperties(flags))
{
if (pi.CanWrite)
{
if(sourceData.ContainsKey(pi.Name))
{
pi.SetValue(aTarget, sourceData[pi.Name], null);
}
}
}
return aTarget;
}
Student source = new Student() { Id = 1, Name = "Smith" };
StudentLog target = MapTo<Student, StudentLog>(source);
위의 개념은 하나의 student 라는 클래스에 객체를 생성한 다음 studentLog 객체에 이를 할당한다.
할당 할때 동일한 속성에는 갑을 할당하여 복제본을 만들고, 맞지 않은 속성은 별도로 할당 하면 된다.
SimpleMapper.zip