سؤال

أحاول حاليًا فهم بعض الجوانب المتعلقة بالبرمجة في C#.الآن أنا أتعلم LateBinding.أنا أفهم كيفية إنشاء بعض البرامج البسيطة مثل البرنامج أدناه.

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Try to do something with late bindings");
        Assembly a = null;
        try
        {
            a = Assembly.Load("CarLibrary");
            Console.WriteLine("1");
        }
        catch (FileNotFoundException ex)
        {
            Console.WriteLine(ex.Message);
        }
        if (a == null)
        {
            CreateUsingLateBinding(a);
        }
        Console.ReadLine();
    }

    private static void CreateUsingLateBinding(Assembly asm)
    {
        try
        {
            Type sportCar = asm.GetType("CarLibrary.SportCar");
            object obj = Activator.CreateInstance(sportCar);
            Console.WriteLine("Success");
            MethodInfo mi = sportCar.GetMethod("TurboBust");
            mi.Invoke(obj, null);
        }
        catch (Exception)
        { }
    }

لقد قمت أيضًا بإنشاء CarLibrary.dll ووضعه في مجلد واحد.لقطة الشاشة لـILDASM

CarLibrary ILDASM

كل شيء يعمل بشكل جيد.لدي فقط بعض الأسئلة بخصوص هذا الموضوع

  • متى يكون من المفيد استخدام هذا؟
  • إذا كنت أستخدم LateBinding، فهل من المفترض أنني لا أعرف أي شيء عن المورد الذي أريد استخدامه أو أنني أعرف كل شيء عنه (في هذه الحالة، لماذا لا أستطيع كتابة البرنامج بطريقة عادية، إذا كنت أعرف كل فئة وطريقة من هذا المصدر)؟لا يزال الأمر محيرًا بعض الشيء بالنسبة لي - حاول العثور على إجابة - النتيجة فقط كيفية الاستخدام.
هل كانت مفيدة؟

المحلول

حسنًا، تخيل أن لديك بعض فصول الأطفال

على سبيل المثال دلل أ

طالب الصف العام :شخص { }

دلل ب

معلم الصف العام :شخص { }

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

public static IEnumerable<Type> GetSubclassesForType(Type baseClassType)
{
    List<Type> types = new List<Type>();
    foreach (Assembly ass in AppDomain.CurrentDomain.GetAssemblies())
    {
       types.AddRange(ass.GetTypes().Where(type => type.IsSubclassOf(baseClassType)));
    }
    return types;
}

public static IEnumerable<Type> GetSubclassesForType(Assembly assembly, Type baseClassType)
{
    return from type in assembly.GetTypes() 
                        where type.IsSubclassOf(baseClassType)    
                        select type;
}

الاستخدام الآخر لـ Late Binding هو أنه يمكن استخدامه إذا كنت تريد تحديث التطبيق الخاص بك عن طريق نسخ ملف dll الذي يحتوي على جزء من التعليمات البرمجية الخاصة بك فقط.يمكن أن يساعدك هذا حقًا عندما تريد تحديث تطبيقات العملاء المتعددة بسرعة. (ملاحظة:يجب عليك أيضًا تخزين نتائج الانعكاس بعد الربط المتأخر لزيادة الأداء)

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