Saya memiliki model objek MyObject dengan berbagai properti. Pada satu titik, saya memiliki dua instance dari MyObject ini: instance A dan instance B. Saya ingin menyalin dan mengganti properti di instance A dengan properti di instance B jika instance B memiliki nilai non-null.
Jika saya hanya memiliki 1 kelas dengan 3 properti, tidak masalah, saya bisa dengan mudah melakukan hard code (yang saya mulai lakukan). Tetapi saya sebenarnya memiliki 12 model objek yang berbeda dengan masing-masing sekitar 10 properti.
Apa cara yang baik untuk melakukan ini?
Update
Gunakan AutoMapper sebagai gantinya jika Anda perlu banyak memanggil metode ini. Automapper membangun metode dinamis menggunakan Reflection.Emit
dan akan jauh lebih cepat daripada reflection.'
Anda bisa menyalin nilai properti menggunakan reflection:
public void CopyValues<T>(T target, T source)
{
Type t = typeof(T);
var properties = t.GetProperties().Where(prop => prop.CanRead && prop.CanWrite);
foreach (var prop in properties)
{
var value = prop.GetValue(source, null);
if (value != null)
prop.SetValue(target, value, null);
}
}
Saya telah membuatnya generik untuk memastikan keamanan tipe. Jika Anda ingin menyertakan properti privat, Anda harus menggunakan override dari Type.GetProperties(), dengan menentukan binding flags.
Saya telah mencoba Merge Two Objects into an Anonymous Type oleh Kyle Finley dan bekerja dengan sempurna.
Dengan TypeMerger
penggabungannya semudah
var obj1 = new {foo = "foo"};
var obj2 = new {bar = "bar"};
var mergedObject = TypeMerger.MergeTypes(obj1 , obj2 );
Itu saja Anda mendapatkan objek yang digabungkan, selain itu, ada ketentuan untuk mengabaikan properti tertentu juga. Anda dapat menggunakan hal yang sama untuk MVC3 juga.
Anda dapat melakukannya dengan menggunakan refleksi, tetapi seperti yang dinyatakan seseorang, itu akan memiliki penalti kinerja.
Karena Anda bekerja dengan desain kelas yang diharapkan, Anda dapat mencapai tujuan yang sama dengan menggunakan metode ekstensi seperti ini:
public static class MyClassExtensions
{
public static void Merge(this MyClass instanceA, MyClass instanceB)
{
if(instanceA != null && instanceB != null)
{
if(instanceB.Prop1 != null)
{
instanceA.Prop1 = instanceB.Prop1;
}
if(instanceB.PropN != null)
{
instanceA.PropN = instanceB.PropN;
}
}
}
Dan kemudian, di suatu tempat dalam kode Anda:
someInstanceOfMyClass.Merge(someOtherInstanceOfMyClass);
Pada akhirnya Anda telah memusatkan operasi ini dalam metode ekstensi dan jika Anda menambahkan atau menghapus properti kelas Anda, Anda hanya perlu memodifikasi implementasi metode ekstensi dan Anda akan menyelesaikan semuanya.