3

サードパーティのアセンブリによって公開されている列挙型を使用しています。

public enum APIEnum
{
  Val1,
  Val2
}

。ただし、これらの値の多くは、私のアプリケーションで誤った動作を引き起こします。これらの「悪い」列挙値の1つがコードで使用されている場合、コンパイラの警告を生成したいと思います。

APIEnum usedVal = APIEnum.Val2;

Compiler Warning: APIEnum.Val2 causes incorrect behavior.

私の最終的な目標は、悪い値が使用された場合に意識的に#pragmaされなければならない警告を生成することです(全体のケースの2%)。それ以外の場合は、警告が発生します。警告はエラーとして表示されるため、修正されるか#pragmaされるまでコンパイルが中断されます。

この問題を解決するためにObsolete属性を使用することについて、ここここでスレッドを見てきましたが、値が実際には廃止されていないため、Obsoleteが混乱を引き起こすのではないかと心配しています。

問題を解決するためにResharperコード分析プラグインを使用する可能性を検討しましたが、それは間違いなくオプションです。私はResharperや、Resharperを介して問題を最もよく解決する方法の専門家ではありません。

4

3 に答える 3

2

このためのカスタムコード分析(FxCop)ルールを作成することも、実際に独自のResharperルールをロールすることもできます。カスタムコード分析ルールは比較的単純である必要があります。正規表現がコンパイルされるかどうかをチェックするルールを確認してくださいRegexOptions。列挙のすべての使用法が検出されます。そこから独自のカスタムルールを作成できるはずです。

カスタムコード分析ルールの一般的な優れたサイト:

独自のルールを作成しているときに行き詰まった場合は、これまでのところコードを共有して、より具体的なヘルプを求めることを躊躇しないでください。

VisitAssignmentステートメントを使用してから、を使用しassignment.Target.Type.FullNameて基になる列挙型を取得します。Target.Typeがnullでもないことを確認してください。デリゲートはnullTypeを持つことができます。

列挙型を示すイントロスペクター

Methodcallには、列挙型も表示されます。

割り当てとメソッドコールを示すイントロスペクター

于 2013-02-11T19:48:37.437 に答える
2

ReSharperで構造検索を使用できます。に移動しReSharper -> Options | Code Inspection -> Custom patterns、をクリックして、フィールドAdd Patternに入力し、エラーの説明をに入力します。パターンの重大度をに設定します。をクリックします。それで全部です。唯一の欠点は、異なる名前空間であっても、プロジェクトに同じ値を持つ別の名前空間がある場合、エラーとしてフラグが立てられることです。APIEnum.Val2Search patternDescriptionShow as errorAddAPIEnumVal2

ReSharper -> Options | Code Inspection -> Settings | Analyse errors in whole solutionまた、すべてのファイルにエラーを表示するには、オンにする必要があります。

于 2013-02-11T19:58:52.233 に答える
0

私はFxCopアプローチを使用してソリューションのプロトタイプを作成しましたが、FxCopが実際にそれを解決できるとは思いません。ルールで次のコードを試しました。

public class DoNotUseSpecificEnum : RuleBase
{
  private string[] _enumValsToCheck =
  {
    "APIEnum.Val2"
  };

  public DoNotUseSpecificEnum ()
    : base("DoNotUseSpecificEnum ") { }

  public override void VisitBinaryExpression(BinaryExpression binaryExpression)
  {
    if ( _enumValsToCheck.Contains(
      binaryExpression.Operand1.ToString()) 
      || _enumValsToCheck.Contains( binaryExpression.Operand2.ToString() ) )
    {
      this.Problems.Add(new Problem(base.GetResolution(),
        binaryExpression.SourceContext));
    }

    base.VisitBinaryExpression(binaryExpression);
  }
}

VisitBinaryExpressionにトレースすると、Operand1の値が「APIEnum.Val2」ではなく「1」であることがわかります。これは後から考えると理にかなっています(列挙型の名前/値を数値リテラルに置き換えたMSILで動作するFxCop)。カスタムFxCopルールの苦痛/栄光を掘り下げる前にそれを実現したかっただけです。:)

私が見つけたもう1つのアプローチは、StyleCopを使用して構文解析を行うことでしたが、これは理解するのがさらに難しく、カスタムFxCopルールよりも人気がありません。

これを管理する方法として、Resharperチーム固有のカスタムパターンの使用を提案します。私はこのアプローチについて引き続き懸念しています(特に、複数のソリューションとチームで同じルールを使用するため)が、ビルドマシンの懸念は私が思っていたよりもはるかに小さいです。TeamCityを使用すると、Resharperルールをすぐにビルド時に検査できるため、少なくとも、Resharper構文を使用して抑制されていない列挙型の使用を検出して報告するようにCIサーバーを構成できます。

于 2013-02-14T06:39:13.330 に答える