2013-04-19 5 views
24

Ich versuche Wege zu finden, Methodenname in einer effizienten Weise zu protokollieren w.r.t. Geschwindigkeit und Wartbarkeit. Ich denke, In .Net 4.5 Caller Information attributes sind nur für diesen Zweck ausgesetzt, außer der Geschwindigkeit Teil. Ich glaube, das sind nur syntaktische Zucker aus der Verwendung von System.Reflection.MethodBase.GetCurrentMethod() oder StackTrace.GetFrame (1) .GetMethod(). Name (Erhielt von here). (oder) Geben diese Methoden auch Leistungsvorteile?Performance-Hit von Caller Information-Attribute

In C#, gibt es eine Möglichkeit, Methodenname zur Kompilierzeit (wie in c++) zu bekommen?

+4

Haben Sie profilierte tatsächlich ihre Leistung, oder sind Sie einfach ein Problem vorgreifen, die kein Problem sein kann? –

+0

@DanielKelley Ich habe die Leistung nicht gemessen. Ich wollte wissen, was im Caller Information-Bereich passiert. Daniel hat erwähnt, dass der Austausch zur Kompilierzeit stattfindet, was genau ich suche. – Imran

Antwort

51

Die Anruferinformationsattribute veranlassen den C# -Compiler, den Namen des Anrufers auf der Callsite anzugeben. Dies geschieht zur Kompilierzeit, es gibt keine Reflexion.

public void DoProcessing() 
{ 
    LogCall(); 
} 

public void LogCall([CallerMemberName] string memberName = "") 
{ 
    Console.WriteLine(memberName + " was called."); 
} 

Wird zu erstellen:

public void DoProcessing() 
{ 
    LogCall("DoProcessing"); 
} 

public void LogCall(string memberName) 
{ 
    Console.WriteLine(memberName + " was called."); 
} 
+0

Genau das suche ich. Danke für die schnelle Antwort. Haben Sie eine Idee, den Kompilierzeitaustausch in den älteren Versionen von .NET zu erreichen? – Imran

+1

[CallerMemberInfo] funktioniert mit jeder .NET-Version, solange Sie den C# 5-Compiler verwenden. Siehe http://stackoverflow.com/questions/13381917/is-the-callermembername-attribute-in-4-5-able-to-be-faked – Daniel

+0

Danke für den Link. Ich verwende derzeit C# 5 Compiler, der VS2012 erfordert. – Imran