Как получить имя исходного файла и номер строки члена типа? - PullRequest
16 голосов
/ 24 сентября 2008

Учитывая, что файл данных отладки доступен (PDB), и с помощью System.Reflection или другой аналогичной среды, такой как Mono.Cecil , как программно получить исходный файл имя и номер строки, в которой объявлен тип или член типа.

Например, допустим, вы скомпилировали этот файл в сборку:

C: \ MyProject \ Foo.cs

1:    public class Foo
2:    {
3:       public string SayHello()
4:       {
5:           return "Hello";
6:       }
7:    }

Как сделать что-то вроде:

MethodInfo methodInfo = typeof(Foo).GetMethod("SayHello");
string sourceFileName = methodInfo.GetSourceFile(); // ?? Does not exist!
int sourceLineNumber = methodInfo.GetLineNumber(); // ?? Does not exist!

sourceFileName будет содержать «C: \ MyProject \ Foo.cs», а sourceLineNumber будет равен 3.

Обновление: System.Diagnostics.StackFrame действительно может получить эту информацию, но только в объеме текущего выполняющегося стека вызовов. Это означает, что метод должен быть вызван первым. Я хотел бы получить ту же информацию, но без вызова члена типа.

Ответы [ 3 ]

11 голосов
/ 30 апреля 2013

Современный метод:

private static void Log(string text,
                        [CallerFilePath] string file = "",
                        [CallerMemberName] string member = "",
                        [CallerLineNumber] int line = 0)
{
    Console.WriteLine("{0}_{1}({2}): {3}", Path.GetFileName(file), member, line, text);
}

Новый Framework API, который заполняет аргументы (отмеченные специальными атрибутами) во время выполнения, см. больше в моем ответе на этот вопрос

1 голос
/ 17 октября 2014

Используя один из методов, описанных выше, внутри конструктора атрибута вы можете указать исходное местоположение всего, что может иметь атрибут - например, класс. Смотрите следующий класс атрибутов:

sealed class ProvideSourceLocation : Attribute
    {
        public readonly string File;
        public readonly string Member;
        public readonly int Line;
        public ProvideSourceLocation
            (
            [CallerFilePath] string file = "",
            [CallerMemberName] string member = "",
            [CallerLineNumber] int line = 0)
        {
            File = file;
            Member = member;
            Line = line;
        }

        public override string ToString() { return File + "(" + Line + "):" + Member; }
    }


[ProvideSourceLocation]
class Test
{
   ...
}

Например, вы можете написать:

Console.WriteLine(typeof(Test).GetCustomAttribute<ProvideSourceLocation>(true));

Вывод будет:

a:\develop\HWClassLibrary.cs\src\Tester\Program.cs(65):
1 голос
/ 24 сентября 2008

вы можете найти помощь по этим ссылкам:

Получение номеров файлов и строк без развертывания файлов PDB также нашел это следующее сообщение

"Привет Марк,

Ниже приведен номер строки вашего кода (в исходный файл):

Dim CurrentStack As System.Diagnostics.StackTrace
MsgBox (CurrentStack.GetFrame(0).GetFileLineNumber)

В случае, если вам интересно, вы можете узнать о рутине, что вы в, а также всех его абонентов.

Public Function MeAndMyCaller As String
    Dim CurrentStack As New System.Diagnostics.StackTrace
    Dim Myself As String = CurrentStack.GetFrame(0).GetMethod.Name
    Dim MyCaller As String = CurrentStack.GetFrame(1).GetMethod.Name
    Return "In " & Myself & vbCrLf & "Called by " & MyCaller
End Function

Это может быть очень удобно, если вам нужна обобщенная процедура обработки ошибок, потому что она может получить имя вызывающего абонента (где будет ошибка).

С уважением, Фергус MVP [кнопка запуска Windows, диалог выключения] «

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...