2016-12-05 5 views
2

Я хочу получить имена методов, так называемой моей функции. Кажется, что-то вроде проблемы с TplКак получить трассировку стека из собственных методов только при использовании TPL?

Есть ли хорошее решение?

BTW: Я осведомлен о CallerMemberName, Но я хочу другое решение так не будет загромождать мой код

Вот мой тестовый код так может сломаться в следующей версии TPL

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine(F1().Result); 
     Console.ReadKey(); 
    } 

    static async Task<string> F1() 
    { 
     return await F2(); 
    } 

    static Task<string> F2() 
    { 
     var callingMethods = new StackTrace().GetFrames().Select(v => v.GetMethod().Name); 
     var result = string.Join(Environment.NewLine, callingMethods); 
     return Task.FromResult(result); 
    } 
} 

И это выходной сигнал

F2

MoveNext

Start

F1

Главная

...

+0

Рассматривали ли вы ** ** почему это немного проблемы с TPL? – Maarten

+0

Потому что они кладут еще один слой между ними – Yacov

ответ

4

Вы можете отфильтровать все узлы, которые не ваш, например, путем проверки сборки не в GAC :

var callingMethods = new StackTrace().GetFrames() 
         .Select(v => v.GetMethod()) 
         .Where(m => !m.DeclaringType.Assembly.GlobalAssemblyCache 
            && !m.DeclaringType.CustomAttributes.Any(ca => ca.AttributeType == typeof(CompilerGeneratedAttribute)) 
           ) 
         .Select(m => m.Name); 

Выход:

F2

F1

Главная