تم نشر المنشور الأصلي على GCDN نظرًا لأن GCDN قامت بإجراء تعديلات على التكامل وتركز الآن على تبادل المنتجات وأسباب أخرى، فقد تم إغلاق مدونة GCDN، لذلك اضطررت إلى نقل بعض المدونة المفيدة هنا.
13 أغسطس 2009 الساعة 12:29 بالغمز
أثناء كتابة هذه المدونة، سألني CyljXu سؤالًا اليوم: كيفية استدعاء طريقة ذات معلمات ref أو out من خلال الانعكاس؟ معتقدًا أن الآخرين قد يواجهون هذه المشكلة، أود تسجيلها ليبحث عنها القراء المستقبليون.
تم شرح ذلك على MSDN، راجع طريقة MethodBase.Invoc.
استدعاء الكائن العام (كائن الكائن، معلمات الكائن [])
فيجوال سي++
عام
: كائن افتراضي ^ استدعاء (Object^ obj، arrayJ#
عام
استدعاء الكائن النهائي (Object obj، Object [] معلمات)
JScript
عام
أخير
وظيفة
استدعاء (obj: كائن، المعلمات: كائن[]) : كائن
المعلمة
نوع الكائن: System.Object
الكائن الذي يتم استدعاء الأساليب أو المنشئات عليه. إذا كانت الطريقة ثابتة، فسيتم تجاهل هذه المعلمة. إذا كان المنشئ ثابتًا، فيجب أن تكون هذه المعلمة مرجعًا فارغًا (لا شيء في Visual Basic) أو مثيل للفئة التي تم تعريف المنشئ فيها.
نوع المعلمات: System.Object[]
قائمة معلمات الطريقة أو المُنشئ المطلوب استدعاؤه. هذه عبارة عن مصفوفة من الكائنات التي لها نفس العدد والترتيب والنوع مثل معلمات الطريقة أو المنشئ الذي يتم استدعاؤه. إذا لم تكن هناك أية معلمات، فيجب أن تكون المعلمات مرجعًا فارغًا (لا شيء في Visual Basic).
إذا كان الأسلوب أو المنشئ الذي يمثله هذا المثيل يأخذ معلمة ref (ByRef في Visual Basic)، فإن المعلمة لا تتطلب أية سمات خاصة عند استخدام هذه الوظيفة لاستدعاء الأسلوب أو المنشئ. إذا لم تتم تهيئة كائن في المصفوفة بشكل صريح بقيمة، فسيحتوي الكائن على القيمة الافتراضية لنوع الكائن هذا. بالنسبة لعناصر نوع المرجع، تكون القيمة مرجعًا فارغًا (لا شيء في Visual Basic). بالنسبة لعناصر نوع القيمة، تكون القيمة 0 أو 0.0 أو خطأ، اعتمادًا على نوع العنصر المحدد.
فكيف يتم الاتصال بالقيمة التي تم تمريرها والتعامل معها؟ يرجى الاطلاع على المثال التالي:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 string content = "main"; //#1 متغير 6 MethodInfo testMethod = typeof(Program).GetMethod("TestMethod", 7 BindingFlags.Static | BindingFlags.NonPublic); 8 if (testMethod != null) 9 {10 // لا يمكن استعادة المحتوى بالطريقة التالية // --------------------- ----------------12 testMethod.Invoc(null, new object[] { content /* #1 متغير */ });13 Console.WriteLine(content // #); متغير واحد، الإخراج هو: main14 // ----------------------------------------- ----15 16 17 object [] invocationArgs = new object[] { content /* #1 متغير */ };18 testMethod.Invoc(null, invocArgs);19 content = (string)invocArgs[0] // متغير #2، تجاوز من الاستدعاء، مضبوط على المحتوى.20 Console.WriteLine(content); // #2 متغير، الإخراج هو: test21 }22 }23 24 static void TestMethod(ref string arg)25 {26 arg = "test "; // #2 المتغير، أريد تجاوز العملية الرئيسية.27 }28 }
لتكون الفاصلة العليا التي حولت "مستحيل" إلى "أنا ممكن"
-------------------------------------------------- --
مدونة WinkingZhang ( http://winkingzhang.cnblogs.com )
GCDN( http://gcdn.grapecity.com/cs )
-