2016-12-05 4 views
2

Ich möchte die Namen der Methoden so genannt meine Funktion, Es scheint ein bisschen ein Problem mit TplWie bekomme ich den Stack-Trace nur von eigenen Methoden, wenn ich TPL verwende?

Gibt es eine gute Lösung?

BTW: Ich bewusst die CallerMemberName, aber ich will eine andere Lösung wird so nicht mein Code

Krempel Hier ist mein Test-Code, so brechen kann in der nächsten Version des 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); 
    } 
} 

und dies ist der Ausgang

F2

Movenext

starten

F1

Haupt

...

+0

Haben Sie darüber nachgedacht ** **, warum es ist ein bisschen ein Problem mit TPL? – Maarten

+0

Weil sie eine andere Schicht dazwischen legen – Yacov

Antwort

4

Sie könnten alle Baugruppen herauszufiltern, die nicht von Ihnen, beispielsweise durch die Montage Überprüfung ist nicht im 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); 

Ausgabe:

F2

F1

Haupt

Verwandte Themen