[英]Way to add an Extension method?
假設我有一個名為LogHelper
的類,它有一個名為GetLogger(string name)
的靜態方法。
有沒有辦法添加一個只是GetLogger()
的靜態擴展方法?
我知道通常擴展方法在聲明它們時是靜態的,但有沒有辦法在它們“幫助”的類上顯示靜態?
您可以使用擴展方法 :
public static class StringExtensions
{
public static ILogger GetLogger(this string value)
{
...
}
}
然后你可以像這樣使用:
string foo = "bar";
ILogger logger = foo.GetLogger();
你也可以使用
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”。
PS如果您想要當前類的記錄器,請使用“this.GetLogger()”(假設采用非靜態方法)。
不幸的是,用擴展方法擴展靜態類是不可能的......
(我假設您的LogHelper是靜態的?至少這是我到目前為止所理解的。)
既然你想要的是不可能的,為什么不假裝呢?
畢竟,無參數GetLogger()
方法是否在LogHelper
上並不重要。 只需編寫自己的靜態類,稱為MyLogHelper
或其他東西,然后在那里定義方法。 代碼如下所示:
public static class MyLogHelper
{
public static ILog GetLogger()
{
return LogHelper.GetLogger("MyHardcodedValue");
}
}
我看到只有一個解決方案是使用可選參數 ,但不幸的是它們只出現在C#4.0中:
public static class LogHelper
{
public static ILogger GetLogger(string name = "DefaultLoggerName")
{
...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.