在扩展类本身内部使用扩展方法

Eug*_*sev 5 c# logging extension-methods

假设我有一个界面,如下所示:

public interface ILoggable
{
    void Log(Func<string> message, Logger.Type type);
}
Run Code Online (Sandbox Code Playgroud)

还有一些扩展方法,如下所示:

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...
}
Run Code Online (Sandbox Code Playgroud)

然后在任何class CoreService : ServiceBase, ILoggable或者这样的我实现它public void Log(Func<string> message, Logger.Type type)到我喜欢的任何东西(公共修饰符是meh ......)并使用所有扩展方法来进行实际记录.

到目前为止这么好......还是不太好?这种方法有问题吗?如果没有,那么为什么不方便:

catch (Exception ex) {
    this.Log(ex); // this works
    Log(ex); // this goes not
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 3

对我来说,这本身似乎是一种合理的方法1 - 但明确声明的要求this只是该语言如何围绕扩展方法工作的一部分。我怀疑这使得语言规范的各个方面更加清晰,并且这种要求非常罕见(并且解决方法足够简单),因此人们认为采用当前的解决方案比仅仅为了避免在一个字符中避免五个字符而使事情变得更复杂更好。比较罕见的场景。

简单名称的成员查找(C# 4 规范的第 7.6.2 节)已经足够复杂,但不会让它变得更糟。不要忘记简单名称可以引用类型或类型参数以及方法。那里已经发生了很多事情。

当我开始工作时,我将检查第 7.6.5.2 节(扩展方法调用)是否有任何注释,其中提供了有关此内容的“内部信息”。


1经过反思,执行日志记录的实体还想记录其他内容似乎有点奇怪- 我希望它看到的唯一一种异常是日志记录失败时,在这种情况下记录异常将也失败了。