C# übergeben der Methode als parameter
Beim einloggen bekommen Sie immer verstrickt in string-literalen.
Ich gelöst, die schön für Eigenschaften, Felder und Variablen, die durch die übergabe einer Expression<Func<T>> expression
(wie bereits hier), so dass Sie tun können, Dinge wie diese:
public void Demo(string someArgument)
{
LogFrameWork.LogLine("Demo"); //goal is to get rid of these string literals
LogFramework.Log(() => someArgument);
}
Will ich tun, etwas ähnliches für die Methode Demo
selbst:
public void Demo(string someArgument)
{
LogFramework.Log(this.Demo);
}
Versuchte ich Dinge wie diese:
public static void Log(Delegate method)
{
string methodName = method.Method.Name;
LogLine(methodName);
}
und so:
public static void Log(Action method)
{
string methodName = method.Method.Name;
LogLine(methodName);
}
Aber bekomme ich compiler Fehler wie diese:
Argument 1: cannot convert from 'method group' to 'System.Delegate'
Argument 1: cannot convert from 'method group' to 'System.Action'
Konnte ich die Einführung einer Reihe von überladungen mit Func<...> und Aktion<...>, aber das klingt zu Komplex.
Gibt es eine Möglichkeit, diese für jede Methode, die mit einer beliebigen Anzahl von Parametern und ein optionales Ergebnis?
--jeroen
PS: ich denke, diese Frage vielleicht haben einige Relevanz hier, aber keine Antworten, die mir ein " aha " - Gefühl 🙂
- Ich verstehe Ihre Frage, aber glaubst du nicht, Sie wäre es viel einfacher und besser erweiterbar mit einigen AOP-framework? Man könnte das erstellen von benutzerdefinierten-Attribut, das würde daneben Methoden, die protokolliert werden sollen, nach dem Aufruf.
- Ich habe AOP in der Vergangenheit, und es verursacht die compile/link-Male zu explodieren. Da .NET hat bereits viel höher compile/link Male, die ich lieber vermeiden.
- Jede Lösung für dieses Allgemeine problem, das ich gesehen habe, die mit expression trees verwendet hat, die mehrere überladungen Ansatz, der ist auch ein bisschen umständlich, da müssen Sie die Parameter enthalten. Wenn ich dabei bin, zu schreiben-Handbuch trace-logging, ich in der Regel geben Sie einfach den Namen der Methode als string-Konstante und verlassen Sie sich auf Resharper um mich daran zu erinnern, um synchron zu halten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anstatt zu versuchen, übergeben Sie der Methode als parameter zu Ihrem logger, schauen Sie es aus der Sicht der logger identifizieren die aufrufende Methode.
Hier ist ein (pseudo -) Beispiel:
Logger-Klasse
Überall, verwendet der logger:
Den Ausgang aus dem logger wird dann sein:
Foo.SomeMethod: Start
MS Enterprise Logging Library
vor ein paar Jahren. Das löste ziemlich viel, was Sie versuchen zu erreichen, ich denke, dass Sie möchten, dass der logger zu wissen, welche Methode aufgerufen, den logger. Die nette Sache über diese ist mit derDeclaringType
werden Sie am Ende mit einem vollen Namensraum der Methode. und keine sorgen über das hinzufügen der Namen der Methode als Bestandteil des logging-Nachricht.Können Sie auch erreichen, ohne das ExpressionTrees durch
System.Diagnostics.StackTrace
.Dann:
Um die MethodInfo-und dann den Namen der aktuellen Methode, oder:
Bekommen die aufrufende Methode.
being optimized away
Teil; meinst du inlining?Dies ist viel schwieriger, als es aussieht. Ich glaube, Sie könnten am besten mit den generischen Func und Action überlastungen, aber es ist ein Weg, dies zu tun mit dem Ausdruck Bäume. Hier ist ein Beispiel, in LINQPad:
Dieser Ausgänge:
Beachten Sie, dass ich hatte, um Lambda-Ausdrücke und geben Sie dummy-Argumente, die beim Aufruf der Log-Methode.
Diese basiert auf Fjodor Soikin ausgezeichnete Antwort.
Können Sie definieren einen Delegaten, dann akzeptieren, dass Delegaten als parameter.
Können Sie rufen Sie Meinemethode wie diese:
oder
Finden Sie unter diesem link für mehr Informationen:
http://msdn.microsoft.com/en-us/library/aa288459(v=vs. 71).aspx
Versuchen Sie dies:
Dann kannst du das tun...
Ich hoffe, dass ich deine Frage verstanden habe korrekt... nicht das tun, was Sie wollen?