[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());
}

انظر إدخال مدونة سكوت هانزلمان للحصول على مزيد من المعلومات.

[تعديل: تمت إضافة ما يلي]

بالنسبة لأولئك الذين يستخدمون .Net 4.5 أو أحدث، النظر في سمات كاليرفيليباث ، كالرميثودنام و كاليرلينينومبر في مساحة الاسم 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.5 يمكنك الحصول على رقم السطر من خلال إنشاء وظيفة:

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

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

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

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

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




بالنسبة لأولئك الذين يحتاجون إلى .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 كيف تريد!