强制我的代码使用我的扩展方法

时间:2014-03-06 11:16:20

标签: c#

我正在使用BitFactory日志记录,它暴露了一堆像这样的方法:

public void LogWarning(object aCategory, object anObject)

我有一个扩展方法,可以让我们的日志记录需求更好:

public static void LogWarning(this CompositeLogger logger, 
      string message = "", params object[] parameters)

其中只包含了一些常见的日志记录操作,这意味着我可以记录如下:

Logging.LogWarning("Something bad happened to the {0}. Id was {1}",foo,bar);

但是当我在params object[]中只有一个字符串时,我的扩展方法将不会被调用,而是会选择原始方法。

除了将我的方法命名为别的外,有什么方法可以阻止这种情况发生?

3 个答案:

答案 0 :(得分:14)

关于如何将重载方法解析为一个(或错误)的规则很复杂(Visual Studio中包含C#规范以获取所有血腥细节)。

但是有一条简单的规则:只有在没有可以调用的成员时才考虑扩展方法。

因为两个对象的签名将接受任何两个参数,所以具有两个参数的任何调用都将匹配该成员。因此,没有任何扩展方法可视为可能性。

您可以传递第三个参数(例如String.Empty),而不是以格式使用它。

或者,我怀疑这是更好的,以避免与库的添加可能的交互(可变长度参数列表方法容易发生这种情况)重命名为LogWarningFormat(类似于StringBuffer.AppendFormat的命名)。

PS。没有必要为message参数设置一个默认值:除非你没有传递任何参数,否则它永远不会被使用:但这不会记录任何内容。

答案 1 :(得分:8)

声明的方法总是在扩展方法之前。 如果要调用扩展而不管声明的方法如何,则必须将其称为声明它的类的常规静态方法。

例如:

LoggerExtensions.LogWarning(Logging, "Something bad happened to the {0}. Id was {1}",foo,bar);

我假设扩展名是在LoggerExtensions

的类中声明的

答案 2 :(得分:2)

如果我认为具有不同名称的方法是可行的方法(更易于阅读和维护),作为一种解决方法,您可以将参数指定为命名参数:

logger.LogWarning("Something bad happened to the {0}.", parameters: "foo");