سؤال

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

AppDomain app = AppDomain.CurrentDomain;
Assembly[] ass = app.GetAssemblies();
Type[] types;
foreach (Assembly a in ass)
{
    types = a.GetTypes();
    foreach (Type t in types)
    {
        MethodInfo[] methods = t.GetMethods();
        foreach (MethodInfo method in methods)
        {
            // Invoke a certain method
        }
    }
}

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

هل كانت مفيدة؟

المحلول

هذا يضربني كمسألة من حيث تعريف المشكلة بدلا من الترميز.

تعتمد أساليب مثيل على مثيل يتم استدعاؤه - لا معنى له في استدعاء طريقة مثيل دون رعاية ما يسمى به. (كما يقول مارتن، هناك طريقة مثيل لا تهتم بالمثيلات التي يتم استدعائها يجب أن تكون ثابتة دائما تقريبا. الاستثناء الفوري الوحيد الذي يمكنني التفكير فيه في هذه الأساليب الافتراضية، حيث تحدد المثيل ضمنيا التنفيذ الذي يجب استخدامه.)

العمل ما هو حقا يعني في سياقك هناك أن تكون طريقة مثيل مشروح. لماذا تحاول استدعاء طرق على أي حال؟ ما هي الصورة الأكبر؟ ما السياق لديك؟ أظن بشدة أنك تريد بعض الفكرة من السياق - مجموعة من الكائنات التي يمكن استدعاء طرق المثيل على.

نصائح أخرى

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

على افتراض أنك لا تستطيع أن تجعله ثابتا ثم الرمز الذي تحتاجه هو كما يلي:

    foreach (Type t in types)
    {
            object instance = Activator.CreateInstance(t);

            MethodInfo[] methods = t.GetMethods();
            foreach (MethodInfo method in methods)
            {                    
                method.Invoke(instance, params...);    
            }
    }

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

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