簡體   English   中英

添加擴展方法的方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM