假設我有一個名爲LogHelper
的類,它有一個名爲GetLogger(string name)
的靜態方法。如何添加擴展方法?
有沒有辦法添加一個靜態擴展方法,只是GetLogger()
?
我知道通常擴展方法是聲明靜態的地方,但是有沒有辦法在類上顯示靜態的「幫助」?
假設我有一個名爲LogHelper
的類,它有一個名爲GetLogger(string name)
的靜態方法。如何添加擴展方法?
有沒有辦法添加一個靜態擴展方法,只是GetLogger()
?
我知道通常擴展方法是聲明靜態的地方,但是有沒有辦法在類上顯示靜態的「幫助」?
你可以使用一個extension method:
public static class StringExtensions
{
public static ILogger GetLogger(this string value)
{
...
}
}
然後你可以使用這樣的:
string foo = "bar";
ILogger logger = foo.GetLogger();
但LogManager上的GetLogger()不是靜態的。它是一個字符串的實例方法。 – Vaccano 2010-09-02 17:21:30
您還可以使用
public static ILogger GetLogger(string value)
{
...
}
public static ILogger GetLogger()
{
return GetLogger("Default Value");
}
這樣,當你叫GetLogger( )它會調用GetLogger(字符串值),但使用默認值。
我不知道這是多高效,但它應該工作。 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()」。
這是不可能與擴展方法,不幸的是擴展靜態類...
(我假設你LogHelper是靜態的?至少這是我的理解爲止。)
我見只有一個解決方案是使用optional arguments,但不幸的是他們只出現在C#4.0:
public static class LogHelper
{
public static ILogger GetLogger(string name = "DefaultLoggerName")
{
...
}
}
既然你想要的東西是不可能的,爲什麼不是假的呢?
畢竟,您的無參數GetLogger()
方法是否在LogHelper
上並不重要。只需編寫自己的靜態類,稱爲MyLogHelper
或其他東西,並在那裏定義方法。代碼如下所示:
public static class MyLogHelper
{
public static ILog GetLogger()
{
return LogHelper.GetLogger("MyHardcodedValue");
}
}
你是指擴展方法嗎? – 2010-09-02 17:01:21
是的,我有。我的壞,我會編輯。 – Vaccano 2010-09-02 17:18:48
您不能將擴展方法添加到靜態類型。擴展方法只能從實例中調用。 – 2010-09-02 17:39:29