Ich bin nicht sicher, was Ihre tatsächlichen Bedürfnisse sind, aber hier ist eine Low-Miete-Option. Es ist nicht gerade „Automatik“, aber man kann Stacktrace verwendet die Informationen, die Sie suchen in einer Art und Weise zu schälen, die nicht vorbei Argumente verlangen würden - ähnlich wie ckramer Vorschlag in Bezug auf Interception:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace TracingSample
{
class Program
{
static void Main(string[] args)
{
DoSomething();
}
static void DoSomething()
{
LogEnter();
Console.WriteLine("Executing DoSomething");
LogExit();
}
static void LogEnter()
{
StackTrace trace = new StackTrace();
if (trace.FrameCount > 1)
{
string ns = trace.GetFrame(1).GetMethod().DeclaringType.Namespace;
string typeName = trace.GetFrame(1).GetMethod().DeclaringType.Name;
Console.WriteLine("Entering {0}.{1}.{2}", ns, typeName, trace.GetFrame(1).GetMethod().Name);
}
}
static void LogExit()
{
StackTrace trace = new StackTrace();
if (trace.FrameCount > 1)
{
string ns = trace.GetFrame(1).GetMethod().DeclaringType.Namespace;
string typeName = trace.GetFrame(1).GetMethod().DeclaringType.Name;
Console.WriteLine("Exiting {0}.{1}.{2}", ns, typeName, trace.GetFrame(1).GetMethod().Name);
}
}
}
}
Sie könnten kombinieren so etwas wie das obige Beispiel mit Vererbung, einen nicht-virtuellen öffentlichen Member in dem Basistyp mit der Aktion-Methode, um anzuzeigen, dann ein virtuelles Mitglied Aufruf zu tun eigentliche Arbeit:
public abstract class BaseType
{
public void SomeFunction()
{
LogEnter();
DoSomeFunction();
LogExit();
}
public abstract void DoSomeFunction();
}
public class SubType : BaseType
{
public override void DoSomeFunction()
{
// Implementation of SomeFunction logic here...
}
}
wieder - es gibt nicht viel „Automatik "darüber, aber es würde auf einer begrenzten Basis funktionieren, wenn Sie Instrumentierung auf jedem einzelnen Methodenaufruf nicht benötigen würden aktion.
Hoffe, das hilft.
Dieser Code geht auch mit diesem Code, um die Parameter zu erfassen Werte http://stackoverflow.com/a/6928253/1267778. Also habe ich etwas wie logService.LogEnter (arg1, arg2, arg3). Tolles Zeug – parliament