C # نسخة الماكرو __FUNCTION__
سؤال
هل أي شخص لديه حلا جيدا لC # نسخة من C ++ __FUNCTION__ ماكرو؟ لا يبدو أن المترجم لمثل ذلك.
المحلول
وحاول استخدام هذا بدلا من ذلك.
System.Reflection.MethodBase.GetCurrentMethod().Name
وليس لديها C # __LINE__
أو __FUNCTION__
وحدات الماكرو مثل C ++ ولكن هناك حكمه
نصائح أخرى
وما يمكنني استخدام حاليا هي وظيفة من هذا القبيل:
using System.Diagnostics;
public string __Function() {
StackTrace stackTrace = new StackTrace();
return stackTrace.GetFrame(1).GetMethod().Name;
}
عند أحتاج __FUNCTION__، أنا مجرد دعوة __Function () بدلا من ذلك. على سبيل المثال:
Debug.Assert(false, __Function() + ": Unhandled option");
وبالطبع يستخدم هذا الحل انعكاس للغاية، ولكن هذا هو أفضل خيار يمكن أن أجد. منذ أن كنت فقط استخدامها لتصحيح (لا تتبع في إطلاق يبني) ضرب الأداء ليس مهما.
وأعتقد أن ما يجب أن أقوم به هو خلق وظائف التصحيح وعلامة لهم
[ Conditional("Debug") ]
وبدلا من ذلك، ولكن ليس لدي جميع أنحاء لذلك.
للأسف لا توجد نسخة مماثلة من أن الماكرو في C #. أنا لا أعتبر أن GetCurrentMethodName () حل يعادل الماكرو C ++ __FUNCTION__. وهي becase وC ++ الإصدار هو وقت الحساب الترجمة من الاسم. لC # هذا هو حساب وقت ويتحمل ضربة الأداء.
وأنا لا يجعل أي assumtions عن شدة التكلفة ولكن هناك واحد
ويجب أن تعمل ما يلي، على الرغم من أنه سيتم تقييمها في وقت التشغيل بدلا من خلال تجميع.
System.Reflection.MethodBase.GetCurrentMethod().Name
وأنا استخدم هذا:
public static string CallerName([CallerMemberName] string callerName = "")
{
return callerName;
}
والاستخدام سبيل المثال:
s_log.DebugFormat("{0}", CallerName());
والجانب السلبي من استخدامه هو أنه في كل مرة تريد طباعة اسم المتصل، وتحتاج للانتقال إلى وظيفة ==> مضيعة للوقت وضرب الأداء! لذلك، أنا استخدامها من أجل التصحيح perpose وإذا كنت بحاجة إلى طباعة أيضا في رمز الإنتاج، وعادة ما مضمنة اسم الدالة في log.Debug، على سبيل المثال :
s_log.Debug("CallerName");
وHTH ..