Al iniciar sesión, siempre se enreda en literales de cadena.C# pase cualquier método como parámetro
He resuelto que muy bien para propiedades, campos y variables haciendo pasar una Expression<Func<T>> expression
(como se explica here), por lo que puede hacer cosas como esta:
public void Demo(string someArgument)
{
LogFrameWork.LogLine("Demo"); // goal is to get rid of these string literals
LogFramework.Log(() => someArgument);
}
Quiero hacer algo similar para el método Demo
propio :
public void Demo(string someArgument)
{
LogFramework.Log(this.Demo);
}
he intentado cosas como esta:
public static void Log(Delegate method)
{
string methodName = method.Method.Name;
LogLine(methodName);
}
y esto:
public static void Log(Action method)
{
string methodName = method.Method.Name;
LogLine(methodName);
}
Pero tengo errores de compilación como estos:
Argument 1: cannot convert from 'method group' to 'System.Delegate'
Argument 1: cannot convert from 'method group' to 'System.Action'
pude introducir un montón de sobrecargas utilizando Func<...> y Action<...>, pero eso suena demasiado complejo.
¿Hay alguna manera de cubrir esto para cualquier método con cualquier cantidad de parámetros y un resultado opcional?
--jeroen
PS: Creo this question podría tener cierta relevancia aquí, pero no hay respuestas que me consiguió un 'ajá' sentirse :-)
entiendo su pregunta, sin embargo, no cree que sería mucho más fácil y más extensible con algún marco de AOP? Puede crear un atributo personalizado que marque los métodos que deben registrarse en la invocación. – empi
He usado AOP en el pasado, y ha causado que los tiempos de compilación/enlace se disparen. Como .NET ya tiene tiempos de compilación/enlace mucho más altos, prefiero evitar eso. –
Cada solución para este problema general que he visto al usar árboles de expresión ha usado el enfoque de sobrecargas múltiples, que también es un poco incómodo, ya que debe incluir parámetros. Si voy a escribir el registro de seguimiento manual, generalmente solo paso el nombre del método como una constante de cadena y confío en Resharper para recordarme que debo mantenerlos sincronizados. –