C# 添加扩展方法的方法?

C# 添加扩展方法的方法?,c#,c#-3.0,C#,C# 3.0,假设我有一个名为LogHelper的类,它有一个名为GetLogger(字符串名)的静态方法 有没有一种方法可以添加一个静态扩展方法,它就是GetLogger() 我知道通常扩展方法在声明的地方是静态的,但是有没有一种方法可以在它们“帮助”的类上显示为静态的呢 然后你可以这样使用: string foo = "bar"; ILogger logger = foo.GetLogger(); public static class MyLogHelper { public static I

假设我有一个名为
LogHelper
的类,它有一个名为
GetLogger(字符串名)
的静态方法

有没有一种方法可以添加一个静态扩展方法,它就是
GetLogger()

我知道通常扩展方法在声明的地方是静态的,但是有没有一种方法可以在它们“帮助”的类上显示为静态的呢

然后你可以这样使用:

string foo = "bar";
ILogger logger = foo.GetLogger();
public static class MyLogHelper
{
    public static ILog GetLogger()
    {
        return LogHelper.GetLogger("MyHardcodedValue");
    }
}
你也可以使用

    public static ILogger GetLogger(string value)
    {
        ...
    }

    public static ILogger GetLogger()
    {
        return GetLogger("Default Value");
    }

这样,当您调用GetLogger()时,它将调用GetLogger(字符串值),但使用默认值

我不确定这有多高效,但它应该能起作用。log4net有一个接受类型的重载,您通常希望以完全限定的类型名命名记录器

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”


另外,如果您想要当前类的记录器(假设为非静态方法),请使用“this.GetLogger()”。

很遗憾,无法使用扩展方法扩展静态类


(我假设您的LogHelper是静态的?至少到目前为止我是这么理解的。)

我认为只有一种解决方案可以使用,但不幸的是它们只出现在C#4.0中:


既然你想要的是不可能的,为什么不假装呢

毕竟,如果您的无参数
GetLogger()
方法启用了
LogHelper
,这其实并不重要。只需编写自己的静态类,称为
MyLogHelper
或其他什么,并在其中定义方法。代码如下所示:

string foo = "bar";
ILogger logger = foo.GetLogger();
public static class MyLogHelper
{
    public static ILog GetLogger()
    {
        return LogHelper.GetLogger("MyHardcodedValue");
    }
}

你是说扩展方法吗?是的,我是。我的错误,我将编辑。您不能向静态类型添加扩展方法。只能从实例调用扩展方法。但是
GetLogger()
在LogManager上不是静态的。这是一个字符串上的实例方法。我不相信它会编译。@Steven Sudit,你是对的,我让它只在构造函数上工作。+1,这显然是OP想要的。我添加了一个缺少的“return”。我想OP希望在不向原始类添加第二个方法的情况下实现这一点。然而,这似乎是不可能的。@Vaccano为什么不添加第二种方法呢?