2010-09-02 77 views
2

假設我有一個名爲LogHelper的類,它有一個名爲GetLogger(string name)的靜態方法。如何添加擴展方法?

有沒有辦法添加一個靜態擴展方法,只是GetLogger()

我知道通常擴展方法是聲明靜態的地方,但是有沒有辦法在類上顯示靜態的「幫助」?

+7

你是指擴展方法嗎? – 2010-09-02 17:01:21

+0

是的,我有。我的壞,我會編輯。 – Vaccano 2010-09-02 17:18:48

+2

您不能將擴展方法添加到靜態類型。擴展方法只能從實例中調用。 – 2010-09-02 17:39:29

回答

6

你可以使用一個extension method

public static class StringExtensions 
{ 
    public static ILogger GetLogger(this string value) 
    { 
     ... 
    } 
} 

然後你可以使用這樣的:

string foo = "bar"; 
ILogger logger = foo.GetLogger(); 
+2

但LogManager上的GetLogger()不是靜態的。它是一個字符串的實例方法。 – Vaccano 2010-09-02 17:21:30

5

您還可以使用

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

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

這樣,當你叫GetLogger( )它會調用GetLogger(字符串值),但使用默認值。

+0

我不相信這會編譯。 – 2010-09-02 17:24:49

+0

@Steven Sudit,你的方式正確,只適用於建設者。 – Gage 2010-09-02 17:32:11

+1

+1,這顯然是OP所尋找的。我添加了一個缺失的「返回」。 – TrueWill 2010-09-02 17:47:50

3

我不知道這是多高效,但它應該工作。 log4net有一個接受Type的重載,並且您經常想在完全限定類型名稱後命名該記錄器。

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

這是不可能與擴展方法,不幸的是擴展靜態類...

(我假設你LogHelper是靜態的?至少這是我的理解爲止。)

1

我見只有一個解決方案是使用optional arguments,但不幸的是他們只出現在C#4.0:

public static class LogHelper 
{ 
    public static ILogger GetLogger(string name = "DefaultLoggerName") 
    { 
     ... 
    } 
} 
2

既然你想要的東西是不可能的,爲什麼不是假的呢?

畢竟,您的無參數GetLogger()方法是否在LogHelper上並不重要。只需編寫自己的靜態類,稱爲MyLogHelper或其他東西,並在那裏定義方法。代碼如下所示:

public static class MyLogHelper 
{ 
    public static ILog GetLogger() 
    { 
     return LogHelper.GetLogger("MyHardcodedValue"); 
    } 
}