هل يمكنني الحصول على مثيل الاستدعاء من داخل إحدى الطرق عبر الانعكاس/التشخيص؟

StackOverflow https://stackoverflow.com/questions/97193

  •  01-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة عبر System.Reflection أو System.Diagnostics أو غيرها للحصول على مرجع للمثيل الفعلي الذي يستدعي طريقة ثابتة دون تمريرها إلى الطريقة نفسها؟

على سبيل المثال، شيء على هذا المنوال

class A
{
    public void DoSomething()
    {
        StaticClass.ExecuteMethod();
    }
}

class B
{
    public void DoSomething()
    {
        SomeOtherClass.ExecuteMethod();
    }
}
public class SomeOtherClass
{
    public static void ExecuteMethod()
    {
        // Returns an instance of A if called from class A
        // or an instance of B if called from class B.
        object caller = getCallingInstance();
    }
}

يمكنني الحصول على النوع باستخدام System.Diagnostics.StackTrace.GetFrames, ولكن هل هناك طريقة للحصول على مرجع للمثيل الفعلي؟

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

ExecuteMethod(instance)

وقد تساءلت فقط عما إذا كان هذا ممكنًا وما زال بإمكاني الوصول إلى المثيل.

ExecuteMethod()

@ ستيف كوبر:لم أفكر في طرق التمديد.قد تنجح بعض الاختلافات في ذلك.

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

المحلول

لا أعتقد أنك تستطيع ذلك.حتى فئتي StackTrace وStackFrame تمنحك معلومات التسمية فقط، وليس الوصول إلى المثيلات.

لست متأكدًا تمامًا من سبب رغبتك في القيام بذلك، ولكن اعلم أنه حتى لو تمكنت من القيام بذلك فمن المحتمل أن يكون بطيئًا للغاية.

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

نصائح أخرى

فكر في جعل هذه الطريقة طريقة تمديد.تعريفها على النحو التالي:

public static StaticExecute(this object instance)
{
    // Reference to 'instance'
}

ويسمى مثل:

this.StaticExecute();

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

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

في حالة استدعاء أسلوب ثابت لأسلوبك الثابت، لا يوجد مثيل استدعاء.

ابحث عن طريقة مختلفة لإنجاز كل ما تحاول القيام به.

فقط اطلب من ExecuteMethod أن يأخذ كائنًا.ثم لديك المثيل مهما كان الأمر.

أشعر وكأنني أفتقد شيئًا ما هنا.يمكن استدعاء الطريقة الثابتة من أي مكان حرفيًا.ليس هناك ما يضمن ظهور مثيل الفئة A أو الفئة B في أي مكان في مكدس الاستدعاءات.

يجب أن تكون هناك طريقة أفضل لإنجاز كل ما تحاول القيام به.

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