no estoy seguro de lo que son sus necesidades reales, pero aquí es una opción de bajo alquiler. No es exactamente "automático", pero se puede usar StackTrace de pelar la información que está buscando en una manera que no exigiría pasar argumentos - similar a la sugerencia sobre intercepción de ckramer:
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);
}
}
}
}
Se puede combinar algo así como el ejemplo anterior con la herencia, el uso de un miembro del público no virtual en el tipo base para indicar el método de acción, a continuación, llamar a un miembro virtual de hacer realidad la obra:
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...
}
}
una vez más - no hay mucho "automático "sobre esto, pero funcionaría de forma limitada si no necesitaras instrumentación en cada método invoc ación.
Espero que esto ayude.
Este código va bien con este código para capturar el parámetro Valor de http://stackoverflow.com/a/6928253/1267778. Entonces tengo algo como logService.LogEnter (arg1, arg2, arg3). Buena cosa – parliament