Способ добавить метод расширения? - PullRequest
2 голосов
/ 02 сентября 2010

Скажем, у меня есть класс с именем LogHelper, и у него есть статический метод с именем GetLogger(string name).

Есть ли способ добавить метод статического расширения, который будет просто GetLogger()?

Я знаю, что обычно методы расширения являются статическими там, где они объявлены, но есть ли способ выглядеть статичными в классе, который они «помогают»?

Ответы [ 6 ]

6 голосов
/ 02 сентября 2010

Вы можете использовать метод расширения :

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

И тогда вы можете использовать вот так:

string foo = "bar";
ILogger logger = foo.GetLogger();
5 голосов
/ 02 сентября 2010

Вы также можете использовать

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

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

Таким образом, когда вы вызываете GetLogger (), он вызывает GetLogger (строковое значение), но с вашим значением по умолчанию.

3 голосов
/ 02 сентября 2010

К сожалению, нельзя расширять статические классы методами расширения ...

(Я предполагаю, что ваш LogHelper статичен? По крайней мере, я так понял.)

3 голосов
/ 02 сентября 2010

Я не уверен, насколько это эффективно, но оно должно работать.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».

PS Используйте «this.GetLogger ()», если вы хотите использовать регистратор для текущего класса (при условии нестатического метода).

2 голосов
/ 02 сентября 2010

Поскольку то, что вы хотите, невозможно, почему бы не подделать это?

В конце концов, на самом деле не имеет значения, включен ли ваш GetLogger() метод без параметров LogHelper. Просто напишите свой собственный статический класс, называемый MyLogHelper или что-то еще, и определите метод там. Код будет выглядеть так:

public static class MyLogHelper
{
    public static ILog GetLogger()
    {
        return LogHelper.GetLogger("MyHardcodedValue");
    }
}
1 голос
/ 02 сентября 2010

Я вижу только одно решение - использовать необязательные аргументы , но, к сожалению, они появляются только в C # 4.0:

public static class LogHelper
{
    public static ILogger GetLogger(string name = "DefaultLoggerName")
    {
        ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...