C++言語では__LINE__
や__FILE__
のマクロでソースコードの行番号やファイル名を取得することができます。C#でもこれと同じようなことをしたいと思って方法を調べてみました。
StackFrameを使う方法
using System;
using System.Diagnostics;
public class Example1
{
public static void Main()
{
StackFrame stackFrame = new StackFrame(true);
int fileLineNumber = stackFrame.GetFileLineNumber();
string fileName = stackFrame.GetFileName();
Console.WriteLine($"FileLineNumber: {fileLineNumber}");
Console.WriteLine($"FileName: {fileName}");
}
}
実行結果
FileLineNumber: 8 FileName: C:\work\example1.cs
CallerLineNumber/CallerFilePathを使う方法
using System;
using System.Runtime.CompilerServices;
public class Example2
{
public static void Main()
{
test();
}
static void test([CallerLineNumber] int lineNumber = 0, [CallerFilePath] string filePath = null)
{
Console.WriteLine($"LineNumber: {lineNumber}");
Console.WriteLine($"FilePath: {filePath}");
}
}
実行結果
LineNumber: 8 FilePath: C:\work\example2.cs
ファイル名のみを取得したい場合
どちらの方法を使っても取得できるのはファイル名ではなく、ファイルパスになっています。ファイル名のみを取得したい場合はGetFileName
を使うと便利です。
string fileName = System.IO.Path.GetFileName(filePath);
リンク
StackFrame Class (System.Diagnostics) | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.stackframe?view=net-6.0
System.Runtime.CompilerServices Namespace | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices?view=net-6.0