添加扩展方法的方法?

时间:2010-09-02 16:59:22

标签: c# c#-3.0

假设我有一个名为LogHelper的类,它有一个名为GetLogger(string name)的静态方法。

有没有办法添加一个只有GetLogger()的静态扩展方法?

我知道通常扩展方法在声明它们时是静态的,但是有没有办法在类“Helping”上显示静态?

6 个答案:

答案 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")
    {
        ...
    }
}