سؤال

ممكن مكررة:
كيف يمكنني العثور على الأسلوب الذي يسمى الحالي الأسلوب ؟

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

البرمجية الزائفة على سبيل المثال:

public Main()
{
     PopularMethod();
}

public ButtonClick(object sender, EventArgs e)
{
     PopularMethod();
}

public Button2Click(object sender, EventArgs e)
{
     PopularMethod();
}

public void PopularMethod()
{
     //Get calling method name
}

داخل PopularMethod() أود أن أرى قيمة Main إذا كان يسمى من Main ...أود أن أرى "ButtonClick"إذا PopularMethod() كان يسمى من ButtonClick

كنت أبحث في System.Reflection.MethodBase.GetCurrentMethod() ولكن هذا لن يحصل لي طريقة الاستدعاء.لقد بحثت في StackTrace الدرجة ولكن أنا حقا لم استمتع بتشغيل كامل تتبع المكدس في كل مرة أن ما يسمى طريقة.

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

المحلول

أنا لا أعتقد أنه يمكن أن يتم دون تتبع المكدس.ومع ذلك, انها بسيطة إلى حد ما للقيام بذلك:

StackTrace stackTrace = new StackTrace();
MethodBase methodBase = stackTrace.GetFrame(1).GetMethod();
Console.WriteLine(methodBase.Name); // e.g.

ومع ذلك, أعتقد أن لديك حقا أن توقف واسأل نفسك إذا كان ذلك ضروريا.

نصائح أخرى

في .NET 4.5 / C# 5, هذا هو بسيط:

public void PopularMethod([CallerMemberName] string caller = null)
{
     // look at caller
}

على مترجم يضيف اسم المتصل تلقائيا ؛ لذلك:

void Foo() {
    PopularMethod();
}

سوف تمر في "Foo".

هذا هو في الواقع بسيط جدا.

public void PopularMethod()
{
    var currentMethod = System.Reflection.MethodInfo
        .GetCurrentMethod(); // as MethodBase
}

ولكن كن حذرا انا متشككا بعض الشيء إذا inlining الأسلوب له أي تأثير.يمكنك القيام بذلك للتأكد من أن JIT compiler لن تحصل في الطريق.

[System.Runtime.CompilerServices.MethodImpl(
 System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public void PopularMethod()
{
    var currentMethod = System.Reflection.MethodInfo
        .GetCurrentMethod();
}

للحصول على طريقة الاستدعاء:

[System.Runtime.CompilerServices.MethodImpl(
 System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public void PopularMethod()
{
    // 1 == skip frames, false = no file info
    var callingMethod = new System.Diagnostics.StackTrace(1, false)
         .GetFrame(0).GetMethod();
}

فقط تمرير معلمة

public void PopularMethod(object sender)
{

}

المنظمة البحرية الدولية:إذا كانت جيدة بما يكفي بالنسبة الأحداث يجب أن تكون جيدة بما فيه الكفاية عن هذا.

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

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

أعتقد أنك لا تحتاج إلى استخدام StackTrace فئة ثم StackFrame.GetMethod() في الإطار التالي.

هذا يبدو وكأنه شيء غريب أن استخدام Reflection على رغم ذلك.إذا كنت تقوم بتعريف PopularMethod, لا يمكنني تحديد المعلمة أو شيء لتمرير المعلومات التي تريد حقا.(أو وضع على قاعدة الطبقة أو ما شابه...)

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