gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:33:21 25 4
gpt4 key购买 nike

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

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

还有一些扩展方法,像这样:

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...
}

然后在任何class CoreService : ServiceBase, ILoggable或者我实现了public void Log(Func<string> message, Logger.Type type)随心所欲(public 修饰符是一种 meh...)并使用所有扩展方法进行实际日志记录。

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

catch (Exception ex) {
this.Log(ex); // this works
Log(ex); // this goes not

最佳答案

这对我来说似乎是一种合理的方法1 - 但显式声明this 的要求只是该语言如何围绕扩展方法工作的一部分。我怀疑这会使语言规范的某些方面更清晰,而且这种要求非常罕见(而且变通方法也足够简单),以至于人们认为采用当前解决方案比仅仅为了避免在一个字符中出现五个字符而使事情变得更复杂更好。相对罕见的情况。

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

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


1 回想起来,执行日志记录的实体想要记录其他东西似乎有点奇怪——这是我期望的唯一一种异常(exception)将在日志记录失败时查看,在这种情况下,记录异常也会失败。

关于c# - 在扩展类本身内部使用扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10696567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com