[c#] كيف يمكنني الحصول على رقم السطر الحالي؟


Answers

استخدم طريقة StackFrame.GetFileLineNumber ، على سبيل المثال:

private static void ReportError(string message)
{
     StackFrame callStack = new StackFrame(1, true);
     MessageBox.Show("Error: " + message + ", File: " + callStack.GetFileName() 
          + ", Line: " + callStack.GetFileLineNumber());
}

راجع إدخال مدونة Scott Hanselman لمزيد من المعلومات.

[تحرير: تمت إضافة ما يلي]

لأولئك الذين يستخدمون .Net 4.5 أو أحدث ، خذ بعين الاعتبار CallerFilePath CallerMethodName و CallerLineNumber و CallerLineNumber في مساحة الاسم System.Runtime.CompilerServices. فمثلا:

public void TraceMessage(string message,
        [CallerMemberName] string callingMethod = string.Empty,
        [CallerFilePath] string callingFilePath = string.Empty,
        [CallerLineNumber] int callingFileLineNumber = 0)
{
    // Write out message
}

يجب أن تكون الوسائط string لـ CallerMemberName و CallerFilePath و int لـ CallerLineNumber ويجب أن يكون لديك قيمة افتراضية. يحدد تحديد هذه السمات على معلمات الطريقة المحول البرمجي لإدراج القيمة المناسبة في رمز الاستدعاء في وقت التحويل البرمجي ، بمعنى أنه يعمل من خلال التعتيم. انظر معلومات المتصل لمزيد من المعلومات.

Question

في ما يلي مثال لما أريد القيام به:

 MessageBox.Show("Error line number "+CurrentLineNumber);

سيكون رقم السطر الحالي هو رقم السطر في شفرة المصدر لهذه الشفرة.

كيف أقوم بذلك؟




لأولئك الذين يحتاجون إلى حل طريقة .NET 4.0+:

using System;
using System.IO;
using System.Diagnostics;

public static void Log(string message) {
   StackFrame stackFrame = new System.Diagnostics.StackTrace(1).GetFrame(1);
   string fileName = stackFrame.GetFileName();
   string methodName = stackFrame.GetMethod().ToString();
   int lineNumber = stackFrame.GetFileLineNumber();

   Console.WriteLine("{0}({1}:{2})\n{3}", methodName, Path.GetFileName(fileName), lineNumber, message);
}

كيف تتصل:

void Test() {
   Log("Look here!");
}

انتاج:

اختبار الفراغ () (FILENAME.cs: 104)

انظر هنا!

تغيير تنسيق Console.WriteLine كيف تحب!




في .NET 4.5 ، يمكنك الحصول على رقم السطر عن طريق إنشاء الوظيفة:

static int LineNumber([System.Runtime.CompilerServices.CallerLineNumber] int lineNumber = 0)
{
    return lineNumber; 
}

ثم في كل مرة تتصل فيها LineNumber() سيكون لديك السطر الحالي. هذا له ميزة على أي حل باستخدام StackTrace أنه يجب أن يعمل في كل من debug و release.

إذا أخذنا الطلب الأصلي لما هو مطلوب ، سوف يصبح:

MessageBox.Show("Error enter code here line number " + LineNumber());

هذا هو بناء على الجواب الممتاز من قبل مارك غرافيل.




Links