0

私は、ロギングを少し簡単にすることを約束するこれらの新しい .NET 4.5 属性を試していました。ランタイムは、値の提供を処理する必要があります。たとえば、[CallerMemberNameAttribute] は、呼び出し元のメソッド名を含む必要がある文字列パラメーターにマップされます。

しかし、MEF が干渉しているように見えることがわかりました。

次のインターフェースを検討してください。

[InheritedExport]
public interface ILogger
{
    void Write(string message, string methodName = "", string srcFilePath = "", int srcLineNumber = 0, params object[] args);
}

そして、次の実装:

public sealed class Logger : ILogger
{
    [MethodImpl(MethodImplOptions.NoInlining)]
    public void Write(string message, [CallerMemberName] string methodName = "", [CallerFilePath] string srcFilePath = "", [CallerLineNumber] int srcLineNumber = 0, params object[] args)
    {
        // do some logging
    }
}

この ILogger をアプリケーションのコンポジション コンテナーにインポートし、ILogger.Write メソッドを使用する場合、ランタイムは [CallerX] 属性でマークされたオプションのパラメーターを入力する必要があります。

ただし、これは発生しません。すべての値がデフォルトに設定されています。

何か案は?それともこれはバグですか?

4

1 に答える 1

2

私は最終的に何が問題であるかを発見しました.実装クラスではなく、インターフェイスに属性を配置する必要がありました。

以下に示すようにインターフェイスを調整すると、修正されました。

[InheritedExport]
public interface ILogger
{
    void Write(string message, [CallerMemberName] string methodName = "", [CallerFilePath] string srcFilePath = "", [CallerLineNumber] int srcLineNumber = 0, params object[] args);
}
于 2012-10-04T14:40:33.230 に答える