2016-11-23 4 views
0

これはかなり...この問題は、WindowsストアアプリケーションをビルドするためのUnityプロジェクトでlog4Netを使用しているところです。 log4Netには、ロガーを宣言したクラスの型または名前(文字列として)が必要です。 Windowsのストア.NETはそれがGetCurrentMethod()などの通常の方法を持っていない変更されているので...私の周りにチェックし、これまでのところ、それは絶望的です。Windowsストアアプリ.NET GetCurrentMethod()。DeclaringTypeの代替

通常の方法は、この

public sealed class SomeClassController : ApiController 
{ 
    private static readonly ILog Log = 
     LoggerManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 
... 

How to get method name win 8 appある - ソリューション属性[CallerMememberName]が(宣言者ではなく)呼び出し元を返すため、ここで提供されている関数は機能しません。 func(Expression expression)メソッドは、メソッド内で使用される場合にのみ機能し、クラスフィールドとしては使用されないため動作しません(log4Netの場合とまったく同じです)。

もう1つの可能性はStackFrameを使用することでしたが、Windowsのストアではサポートされていませんでしたが、StackTraceを取得する唯一の方法は例外です。 2.すべての例外スローをUnityプロダクションで削除する必要があります。

GetType()のような単純なソリューションは、継承されたクラスがオーバーライドされると機能しません。 More here - http://rundevrun.blogspot.lt/2012/11/gettype-vs-methodbasegetcurrentmethodde.html

オプションが不足しています。クラスフィールドで使用する場合、DeclaringTypeを取得する方法はありませんか?

+2

あなたは単に' typeof'を使うことはできません?はい、それはカットアンドペーストフレンドリーではありませんが、それははるかに簡単なアプローチです... –

+0

いくつかの複雑な状況では、どのクラスタイプがそれを宣言し、それを指定する必要があります。 – MattJ

+2

私は、これらの複雑な状況では、 'typeof'を使う方がはるかに分かりやすいと思います。とにかく、あなたはオプションが不足していると言った:私は 'typeof'は間違いなく選択肢であり、本当に簡単だと言いたい。 –

答えて

1

だけではなく、typeofを使用する - それははるかに簡単だし、任意のフレームワークのサポートを必要としません:

public sealed class SomeClassController : ApiController 
{ 
    private static readonly ILog Log = 
     LoggerManager.GetLogger(typeof(SomeClassController)); 
    ... 
} 

唯一の欠点は、あなたがコピー&ペースト場合には、他の場所で、あなたがログインし終わるだろうということです間違ったクラス。 「検索全てLoggerManager.GetLoggerへの呼び出しと審査のプレリリースプロセスステップを持って

  • が、コードレビューに
  • 注意しながら、問題を発見するロザリンコードアナライザ(または類似の)書き込み

    • :あなたがでていることを軽減することができそれらの "