假设我有一个名为LogHelper
的类,它有一个名为GetLogger(string name)
的静态方法。
有没有办法添加一个只有GetLogger()
的静态扩展方法?
我知道通常扩展方法在声明它们时是静态的,但是有没有办法在类“Helping”上显示静态?
答案 0 :(得分:6)
您可以使用extension method:
public static class StringExtensions
{
public static ILogger GetLogger(this string value)
{
...
}
}
然后你可以这样使用:
string foo = "bar";
ILogger logger = foo.GetLogger();
答案 1 :(得分:5)
您也可以使用
public static ILogger GetLogger(string value)
{
...
}
public static ILogger GetLogger()
{
return GetLogger("Default Value");
}
这样当你调用GetLogger()时,它会调用GetLogger(字符串值)但是使用你的默认值。
答案 2 :(得分:3)
我不确定这是多么有效,但它应该有效。 log4net有一个接受Type的重载,你经常想在完全限定的类型名称之后命名logger。
void Main()
{
var foo = new Bar.Foo();
ILog logger = foo.GetLogger();
}
public static class LogHelper
{
public static ILog GetLogger(this object o)
{
return LogManager.GetLogger(o.GetType());
}
}
namespace Bar
{
public class Foo {}
}
// Faking log4net
public class ILog {}
public class LogManager
{
public static ILog GetLogger(Type type)
{
Console.WriteLine("Logger: " + type.ToString());
return null;
}
}
以上打印“Logger:Bar.Foo”。
P.S。如果你想要一个当前类的记录器(假设是非静态方法),请使用“this.GetLogger()”。
答案 3 :(得分:3)
不幸的是,无法使用扩展方法扩展静态类......
(我假设您的LogHelper是静态的?至少这是我目前所理解的。)
答案 4 :(得分:2)
既然你想要的是不可能的,为什么不假装呢?
毕竟,如果您的无参数GetLogger()
方法在LogHelper
上,则无关紧要。只需编写自己的静态类,称为MyLogHelper
或其他东西,然后在那里定义方法。代码如下所示:
public static class MyLogHelper
{
public static ILog GetLogger()
{
return LogHelper.GetLogger("MyHardcodedValue");
}
}
答案 5 :(得分:1)
我看到只有一个解决方案是使用optional arguments,但不幸的是它们只出现在C#4.0中:
public static class LogHelper
{
public static ILogger GetLogger(string name = "DefaultLoggerName")
{
...
}
}