سؤال

لقد قمت بكتابة فصل دراسي بطريقة ثابتة واحدة تقوم بنسخ قيم الخاصية من كائن إلى آخر.لا يهم نوع كل كائن، فقط أن لديهم خصائص متطابقة.إنه يفعل ما أحتاج إليه، لذا فأنا لا أقوم بهندسته بشكل أكبر، ولكن ما هي التحسينات التي ستجريها؟

إليك الكود:

public class ShallowCopy
{
    public static void Copy<From, To>(From from, To to)
        where To : class
        where From : class
    {
        Type toType = to.GetType();
        foreach (var propertyInfo in from.GetType().GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance))
        {
            toType.GetProperty(propertyInfo.Name).SetValue(to, propertyInfo.GetValue(from, null), null);
        }
    }
}

أنا أستخدمه على النحو التالي:

EmployeeDTO dto = GetEmployeeDTO();
Employee employee = new Employee();
ShallowCopy.Copy(dto, employee);
هل كانت مفيدة؟

المحلول

هل DTOs بك تسلسل؟ أتوقع ذلك، في هذه الحالة:

MemberInfo[] sm = FormatterServices.GetSerializableMembers(typeof(From));
object[] data = FormatterServices.GetObjectData(from, sm);
FormatterServices.PopulateObjectMembers(to, sm, data);

ولكن لاحظ أنني لا أتفق فعلا مع هذا النهج العام. وأود أن تفضل عقد قوي للنسخ على DTOs بك أن كل DTO تنفذ.

نصائح أخرى

  • قم بتغيير أسماء معلمات النوع الخاصة بك لتتوافق مع اصطلاحات التسمية، على سبيل المثال.TFrom وTTo، أو TSource وTDest (أو TDestination).

  • قم بمعظم عملك بنوع عام بدلاً من مجرد طريقة عامة.يتيح لك ذلك تخزين الخصائص مؤقتًا، بالإضافة إلى السماح باستدلال النوع.يعتبر استنتاج النوع مهمًا في المعلمة "TFrom"، لأنه سيسمح باستخدام الأنواع المجهولة.

  • من المحتمل أن تجعل الأمر سريعًا بشكل مذهل عن طريق إنشاء تعليمات برمجية ديناميكيًا للقيام بنسخ الخاصية والاحتفاظ بها في مفوض صالح للنوع "من".أو من المحتمل أن يتم إنشاؤها لكل زوج من/إلى، مما يعني أن النسخ الفعلي لن يحتاج إلى استخدام الانعكاس على الإطلاق!(ستتم عملية إعداد الكود مرة واحدة لكل زوج من الأنواع، ولكن نأمل ألا يكون لديك عدد كبير جدًا من الأزواج.)

وطريقة جديدة أن إنشاء مثيل جديد من To واستدعاء الأسلوب Copy() قبل عودته قد تكون مفيدة.

ومثل هذا:

public static To Create<From, To>(From from)
    where To : class, new()
    where From : class
{
    var to = new To();
    Copy(from, to);
    return to;
}

وتقرر ما تريد أن تفعل إذا مرت الأشياء من الأنواع التي تشترك في بعض الخصائص ولكن ليس كل شيء. تحقق من وجود العقار في كائن From في كائن To قبل محاولة ضبطه من القيمة. هل "الشيء الصحيح" عندما جئت إلى الممتلكات التي لا وجود لها. وإذا كان كل من الممتلكات العامة بحاجة إلى أن تكون متطابقة، فإنك سوف تحتاج للتحقق مما إذا كنت قد وضعت كل منهم على الكائن To ومعالجة الحالة حيث لديك ليس بشكل مناسب.

وأنا أقترح أيضا أنك قد ترغب في استخدام الصفات لتزيين الخصائص التي تحتاج إلى نسخ وتجاهل الآخرين. هذا من شأنه أن يسمح لك أن تذهب ذهابا وإيابا بين اثنين من الكائنات المختلفة أكثر سهولة والاستمرار في الحفاظ على بعض الممتلكات العامة التي هي مستمدة بدلا من تخزينها على وجوه عملك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top