3

新しい WPF 4.5 CompositeWPF (Prism) プロジェクトにログ機能を実装しようとしています。これには、コードに ILoggerFacade を実装する必要があります。インターフェイスは 1 つのメソッドのみを実装します: Log(string message, Category category, Priority priority).

ILoggerFacadeインターフェース:

public interface ILoggerFacade
{
    void Log(string message, Category category, Priority priority);
}

私の実装:

public class Log4NetLogger : ILoggerFacade
{
    private static readonly ILog m_Logger = LogManager.GetLogger(typeof(ILoggerFacade));

    public void Log(string message, Category category, Priority priority)
    {
        switch (category)
        {
            case Category.Debug:
                m_Logger.Debug(message);
                break;
            case Category.Warn:
                m_Logger.Warn(message);
                break;
            case Category.Exception:
                m_Logger.Error(message);
                break;
            case Category.Info:
                m_Logger.Info(message);
                break;
        }
    }
}

新しく導入された[CallerMemberName]属性を使用すると、次のような方法を知っていれば、呼び出し元のメソッド名をロガーに渡すことができるはずです。

public class Log4NetLogger : ILoggerFacade
{
    public void Log(string message, Category category, Priority priority, [CallerMemberName] string callerMethod = "")
    {
         ...

私の質問は、Logサードパーティ (Prism) インターフェイスによって強制されるメソッドをオーバーライドして、追加のオプションのパラメーターを 1 つ含めるにはどうすればよいですか? または、ログに記録できるように、この属性を使用して呼び出し元のメソッド名を渡すにはどうすればよいですか?

他の同様の質問を見たことがありますが、[CallerMemberName] 属性は .NET 4.5 の新機能であるため、提示されたものよりも優れた解決策を期待しています。

4

2 に答える 2

5

残念ながら、この作業を行うことができる唯一の方法は、Prismソースを変更してバイナリを再構築することです。たとえば、callerMethodパラメータをILoggerFacadeのLogメソッドに追加します。

public interface ILoggerFacade
{
    void Log(string message, Category category, 
             Priority priority, [CallerMemberName] string callerMethod = "");
}

また、すでにILoggerFacadeを実装しているクラスがある場合は、それらも変更する必要があります。

于 2013-03-06T21:41:45.593 に答える