Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在扩展类本身内部使用扩展方法_C#_Logging_Extension Methods - Fatal编程技术网

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

C# 在扩展类本身内部使用扩展方法,c#,logging,extension-methods,C#,Logging,Extension Methods,假设我有一个界面,如下所示: 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.Infor

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

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

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

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

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



1反省一下,做日志记录的实体还想记录其他事情,这似乎有点奇怪——我希望它看到的唯一一种异常是当日志记录失败时,在这种情况下,记录异常也会失败。

您也可以调用
log(这个,例如)
在这种情况下,它看起来更具可读性。@HenkHolterman:嗯,您必须调用Logger.Log(这个,ex)…CoreService主要是通过网络获取数据并将其放入数据库中。它必须有一些方法来记录它的活动。如果它的某些操作失败,它会记录下来。如果日志记录失败,它可能会忽略它(用于网络日志记录)或关闭它自己(用于文件日志记录)或watever-这是在实现接口时要实现的。@EugeneRyabtsev:感觉它应该有一个知道如何进行日志记录的日志记录成员,而不是实现日志记录接口本身。这是一个实现细节,而不是作为一种其他人可以使用的功能来宣传的东西,这就是接口的用途。将日志记录与“通过网络获取数据”分开。编写一个类,其唯一任务是记录日志,然后使该类的一个实例可用于CoreService。然后,该成员(可作为logger.Log(…)调用)必须是一个多态类,以重用所有日志(…)代码,并且我必须为我要登录到的特定情况以及如何过滤开/关的每个特定情况生成一个后代当然,可能是这样。当然,以前我在C++中实现了多继承,这样一个类可以实现并记录它的活动,并且它是非常独立的,思想界面是很接近的。@ EuGuyyAbtEvv:不确定你的意思是什么?这里的“必须是多态类”——我可能只是通过接口(ILogger或其他什么)将CoreService与日志记录耦合起来.有很多现有的日志框架已经有了过滤、格式化等功能-你为什么要重新发明轮子?接口真的不是这里要走的路-你会期望一个单独的组件为了日志目的调用CoreService吗?这是实现接口所宣传的,真的-它不起作用d就在这里。哦,明白了。相同的接口,只是在另一个类上。不使用现有的框架主要是因为我不需要像3兆字节的代码(log4net)这样复杂的东西。
catch (Exception ex) {
    this.Log(ex); // this works
    Log(ex); // this goes not