我正在使用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[]
中只有一个字符串时,我的扩展方法将不会被调用,而是会选择原始方法。
除了将我的方法命名为别的外,有什么方法可以阻止这种情况发生?
答案 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");