Digamos que tengo una interfaz, como esto:Uso de métodos de extensión dentro de clase extendida en sí
public interface ILoggable
{
void Log(Func<string> message, Logger.Type type);
}
Y algunos métodos de extensión, así:
public static class Logger
{
public static void Log(this ILoggable loggable, Func<string> message) { loggable.Log(message, Type.Information); }
public static void Log(this ILoggable loggable, string prefix, byte[] data, int len) { /* snip */ }
public static void Log(this ILoggable loggable, Exception ex) { /* snip */ }
// And so on...
}
Luego, en cualquier class CoreService : ServiceBase, ILoggable
o cualquier implemento que public void Log(Func<string> message, Logger.Type type)
a lo que me gusta (el modificador público es algo así como meh ...) y utiliza todos los métodos de extensión para hacer el registro real.
Hasta ahora todo bien ... ¿o no tan bueno? ¿Hay algo mal con este enfoque? Si no es así, entonces ¿por qué los inconvenientes:
catch (Exception ex) {
this.Log(ex); // this works
Log(ex); // this goes not
También puede llamar a 'Log (this, ex)' que en este caso parece ser más legible. –
@HenkHolterman: Bueno, tendrías que llamar a Logger.Log (esto, ex) ... –