2010-09-02 3 views
2

Скажем, у меня есть класс под названием LogHelper и он имеет статический метод, называемый GetLogger(string name).Способ добавления метода расширения?

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

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

+7

Вы имеете в виду методы расширения? –

+0

Да, я знаю. Мой плохой, я отредактирую. – Vaccano

+2

Вы не можете добавлять методы расширения к статическим типам. Методы расширения можно вызывать только из экземпляров. –

ответ

6

Вы можете использовать extension method:

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

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

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

Но 'GetLogger()' не является статичным в LogManager. Это метод экземпляра в строке. – Vaccano

5

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

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

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

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

+0

Я не верю, что это скомпилируется. –

+0

@Steven Sudit, вы были правы, так как я работал только над конструкторами. – Gage

+1

+1, это, по-видимому, то, что искали ОП. Я добавил отсутствующий «возврат». – TrueWill

3

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

Вышеупомянутые гравюры «Регистратор: 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"); 
    } 
}