0

バックグラウンド

ビルド プロセスの一部として実行されるスクリプトがいくつかあります。これらのスクリプトは、さまざまなソース コード ファイルを調べて、追加のソース コードを生成します。

スクリプトは CodeDom を使用してスクリプトを生成し.cs、単純なテキスト リーダーを使用してファイルを読み取ります。

質問

スクリプトの 1 つは、呼び出された特定のクラス属性の使用を探してPageMenuItemおり、その目的は、ページ メニュー項目の静的リストを作成することです。

.csすべてのファイルを読み取って"PageMenuItem"属性を探し、引数の数を数え、どのコンストラクターが使用されているかを把握して、さまざまな情報を引き離すことで、これを実行します。

さまざまなパラメーターを持つ 7 つのコンストラクターがあるため、ソース コードからどのコンストラクターが使用されているかを判断し、情報を解析する方法をPageMenuItem判断することが非常に難しくなっています。.cs

PageMenuItem自分でテキストを解析しようとする代わりに、単純にメモリ内にオブジェクトを構築してから、そのプロパティを使用したいと考えています。

そのため、ファイルから属性宣言を取得し、そこから.cs新しいインスタンスを構築する方法が必要PageMenuItemです。

それは可能ですか?


この質問の別の言い方:

次の文字列を指定します。

string myCodeStatement = "[MyAttribute(\"asdf\", \"foo\")]";

そのオブジェクトを操作できるように、そのタイプのオブジェクトを作成するにはどうすればよいMyAttributeですか? を定義するソース コードに完全にアクセスできますMyAttribute

4

4 に答える 4

1

このスクリプトはビルド プロセスの一部であるため、かなり迅速に実行する必要があります。また、コンパイルされるソース コードが生成されるため、プロジェクトの「二重コンパイル」を回避したいと考えています。

また、アセンブリを反映するためだけにアセンブリをコンパイルしてロードする必要もありません。これは、ビルド プロセス中に数百回実行すると「費用がかかる」ように思われます。

属性を解析する方法を修正する必要があると判断しました。---

私はすでにソースコードを読んでいて、属性の数を数えようとしています。そのコードを変更して、引数をその型に解析Activator.CreateInstance()し、解析した引数を使用して使用できるようにすることにしました。Activator は使用するコンストラクターを判断し、属性クラスのインスタンスを取得して、そのプロパティを使用できるようにします。

属性のコンストラクターで使用できる型は既にわかっているので、parans 間のものを正しい型 (string、int、guid など) に解析する小さなメソッドを作成し、そのオブジェクト配列を Activator に渡します。

Activator は正しいコンストラクターを見つけるという大変な作業を行い、属性クラスのインスタンスを返します。

于 2009-12-01T00:14:12.350 に答える
1

クラスファイルをイントロスペクトするか、代わりにコンストラクターに注釈を追加して、解析ジョブをより簡単にすることができるようです。アスペクト指向の手法が役立つ場合があります-コンストラクターが呼び出されるたびにキャプチャし、そのままリストにアイテムを追加します。

于 2009-11-30T22:42:40.867 に答える
1

これを行うには、 CSharpCodeProviderを使用できます。プロセスを説明するMicrosoft サポート記事があります。

于 2009-11-30T22:42:54.360 に答える
1

コンパイラの呼び出しはオプションですか? ソース ファイル自体をビルドし、リフレクションを使用して属性をウォークするか、それらの属性でマークアップするダミー ソース ファイルを作成することができます。いずれにせよ、コンパイルが完了したら、反映して属性のプロパティにアクセスできます。

于 2009-11-30T22:44:53.373 に答える