4

PropertyInfo パラメーターを受け取るメソッドがあり、IL からこのメソッドを呼び出したいアプリケーションがあります。たとえば、MethodInfo を受け取る同様のメソッドの場合、RuntimeMethodHandleを受け取る中間メソッドを作成し、 GetMethodFromHandleを使用できます。その後、IL はLdtokenを使用してハンドルを渡すことができます。

ただし、プロパティの同等のメタデータ トークンはないようです。これが当てはまる理由はわかりますが (プロパティは実際にはメソッドをまとめる方法であり、IL から「呼び出される」ことはないため)、型に関連付けられたプロパティ メタデータが確実に存在します。私は Emit 時にこのプロパティ メタデータにアクセスできるので、実行時に名前で Reflection に頼ることなくこれを直接渡すことができる方法が必要です (つまり、実行時に実行される文字列を取得する GetProperty への Reflection 呼び出しを発行します)。これを行う方法はありますか?


コメントのリクエストによると、アプリケーションは次のとおりです。

プロパティを介してコンポーネント ビットとしてプロパティ参照を公開するアダプター クラスを作成していbool this[int index]ます。私のアプリケーションは PLC コードを .NET アセンブリにコンパイルするため、PLC によって提供される簡単なビット単位のアクセスに近似する診断アクセサーを作成しようとしています (ここでMyTag.2、 tag のビット 2 を示すために書き込みMyTagます)。 C# による消費PLC.GetBits().MyTag[2]ですが、妥当な概算です。

私の元のアプローチは PropertyInfo を使用して実装されていましたが (これが私がこの問題に遭遇した方法です)、PropertyInfo から適用可能なメタデータを複数のパラメーターとして渡すことで確実に回避できます。これまでにこれに遭遇したことがなかったので、PropertyInfo を直接渡すことができるかどうかを確認することに主に興味がありました。

4

2 に答える 2

3

Ecma-335、パーティション I、8.10.3プロパティとイベントの継承を参照してください。

基本的に、プロパティとイベントは、CLI を対象とするツールで使用するためのメタデータの構成要素であり、VES 自体では直接サポートされていません。したがって、名前の隠蔽、継承などのルールを決定するのは、ソース言語コンパイラとリフレクション ライブラリ (パーティション IV – カーネル パッケージを参照) の仕事です。ソース コンパイラは、イベントまたはプロパティ自体ではなく、イベントおよびプロパティによって指定されたメソッドに直接アクセスする CIL を生成する必要があります。

Ecma-335、パーティション I、8.11.3プロパティ定義

プロパティ定義は、常にインターフェイス定義またはクラス定義の一部です。プロパティ定義の名前と値は、プロパティ定義を含む型にスコープされます。CTS では、他のメソッド コントラクトと同様に、プロパティを構成するメソッド コントラクトがメソッドの実装と一致する必要があります。プロパティに関連付けられた CIL 命令はなく、メタデータのみです。

于 2013-05-04T23:39:18.420 に答える