Вот очень простая (и также неэффективная) функция расширения, которая поможет вам начать работу (убедитесь, что вы импортируете System.Reflection
и System.Linq
):
public static void GetDataFrom<T>(this T ObjToCopyTo, T ObjToCopyFrom) where T : class {
foreach (var property in ObjToCopyTo.GetType().GetProperties().Where(x => x.CanWrite))
property.SetValue(ObjToCopyTo, property.GetValue(ObjToCopyFrom, null), null);
}
.Вероятно, вы обнаружите, что вам придется поместить некоторые специальные случаи для таких вещей, как первичные ключи, и можете решить, что вы не хотите копировать каждое свойство точно, но, надеюсь, это показывает идею ответа VVS.
Если выУстановив linqpad , вы можете поиграть с этой идеей с помощью следующего скрипта:
void Main()
{
var foo = new Helper.Foo() {
field1 = "hi",
field2 = 5,
field3 = 3.14,
field4 = 'm'
};
var foo2 = new Helper.Foo();
foo.Dump("Foo Before");
foo2.Dump("Foo2 Before");
foo2.GetDataFrom(foo);
foo.Dump("Foo After");
foo2.Dump("Foo2 After");
}
public static class Helper {
public class Foo {
public string field1 { get; set; }
public int field2 { get; set; }
public double field3 { get; set; }
public char field4 { get; set; }
}
public static void GetDataFrom<T>(this T ObjToCopyTo, T ObjToCopyFrom) where T : class {
foreach (var property in ObjToCopyTo.GetType().GetProperties().Where(x => x.CanWrite))
property.SetValue(ObjToCopyTo, property.GetValue(ObjToCopyFrom, null), null);
}
}
Надеюсь, это поможет!