1

準動的メソッドを使用して、t4 テンプレートを使用して SQL ルックアップ テーブルから列挙型を作成しています。テンプレートは、ルックアップ パターンに準拠するすべてのテーブルの列挙型を生成します。これらの列挙型のいくつかはコードで使用されていませんが、いずれかが使用される可能性があります。

これはうまくいきましたが、ユーザーが新しい値を追加したり、説明を編集したりできるように、ルックアップ管理インターフェイスを作成するよう求められました。

彼らは現在コードで列挙値として使用されている項目を変更したくないので、列挙値が使用されているかどうかを調べるためにアセンブリにクエリを実行する簡単な (またはそれほど単純ではない) 方法はありますか?

この作成された例に似たコードがたくさんあります。

public Role GetAdminRole
{
  using (myContext ctx = new myContext()
  {
    return ctx.Roles.Where(i=> i.RoleId == (int)RoleEnum.Admin).SingleOrDefault();;
  }
}

Type.FindMembers() を使用して、メソッドの内部を照会できるフィルターを作成する方法はありますか?

System.Reflection.EmitEnumBuilder クラスに基づいて有望に思われる名前空間を見てきましたが、ビルダーを既存のアセンブリに接続する方法がわかりませんでした。名前System.Diagnostics.CodeAnalysis空間は興味深いように聞こえますが、含まれている属性は 2 つだけです (警告を抑制し、コードをカバレッジから除外するため)。

編集:ILSpyを調べているときに、コンパイル時に上記の方法で使用すると、メソッドの列挙値が整数値に変換されることを知っていたが、まとめていないことがわかりました。

4

1 に答える 1

1

実行時にチェックすることを主張する場合は、クラスのGetILAsByteArrayメソッドを使用して IL を取得し、それを解析して、列挙が使用されている場所を検索できます。MethodBody

ご想像のとおり、すべてのモジュール、すべてのアセンブリで、すべての型のすべてのメソッドを実行する必要があるため、これは非常に苦痛になります。

コードに対してある種の静的分析を使用することを強くお勧めします。たとえば、 ReSharperは、メンバーが使用されているかどうかを通知できます。

社内ソリューションをコーディングしたい場合は、Roslynを調べてコードを分析できます (警告、この記事の執筆時点では CTP です)。プロジェクト内のコードを解析し、自分で分析を行うことができます。

とはいえ、最終的な出力アセンブリではなく、コードを分析するツールを見つけるのが最善です。

于 2012-10-19T15:37:02.063 に答える