問題タブ [reflection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
4584 参照

c# - C#での「is」リフレクションのパフォーマンス特性は何ですか?

「as」キャストはプレフィックス キャストよりもはるかに高速であることが示されていますが、「is」リフレクションはどうでしょうか。どれくらい悪い?ご想像のとおり、Google で「is」を検索してもあまり効果的ではありません。

0 投票する
2 に答える
19829 参照

c# - 同じアセンブリの異なるバージョンの読み込み

リフレクションを使用して、同じアセンブリの 2 つの異なるバージョンを読み込む必要があります。同じプロセスで 2 つの異なる AppDomains に 2 つのバージョンをロードできますか?

アプリの古いバージョンから新しいバージョンにデータを移行する必要があります。これが可能かどうか、または 2 つの別々のプロセスを使用する必要があるかどうかをお知らせください。

0 投票する
2 に答える
16455 参照

c# - リフレクションのために C# で実行時にアセンブリとそのすべての依存関係を読み込むにはどうすればよいですか?

私は自分用にユーティリティを作成しています。これは、C# リフレクションを学習するための演習として、また、作成したツールを実際に自分で使用したいからです。

私が求めているのは、基本的にアプリケーションをアセンブリに向け、エクスポートされた HTML フォームにフィールドとして含める必要があるプロパティを選択する特定のクラスを選択することです。そのフォームは、ビューの開始として ASP.NET MVC アプリで使用されます。

使用したいアプリケーションに Subsonic オブジェクトを使用しているので、これは合理的なはずであり、データ型に応じて異なる出力 HTML などを含めることで、Reflection がこれを実現する方法であると考えました。

しかし、私が探しているものはとらえどころのないようです。OpenFileDialog で選択した DLL/EXE を開始点としてロードしようとしています。

これは正常に動作しますが、Subsonic で生成されたオブジェクトは実際には Subsonic.dll などで定義されているオブジェクト タイプでいっぱいであるため、それらの依存オブジェクトは読み込まれません。入る:

それも、私が期待するものを正確に含んでいます。ただし、私が理解しようとしているのは、オブジェクトへの掘り下げが適切に機能するように、これらのアセンブリをロードする方法です。これらのアセンブリが GAC または実行中の実行可能ファイルのディレクトリにある場合、それらの名前で読み込むことができることは理解していますが、このユース ケースには当てはまらない可能性が高く、それが私の主なユース ケースです。

要するに、特定のアセンブリと、ファイル名で始まるすべての任意のアセンブリをロードして、型、プロパティ、メソッドなどの完全にリフレクションで参照可能なツリーを作成する方法です。

Reflector のようなツールがこれを行うことは知っていますが、それを取得するための構文が見つかりません。

0 投票する
8 に答える
8808 参照

c# - リフレクションを使用して ASP.NET Web サービスを呼び出す

ASMX Web サービス MyService があるとします。このサービスには、MyMethod というメソッドがあります。次のように、サーバー側で MyMethod を実行できます。

実行時までわからないサービスとメソッドを使用して、同様のことを行う必要があります。

私は反省がそれについて行く方法であると仮定しています。残念ながら、私はそれを機能させるのに苦労しています。このコードを実行すると:

次のエラーがスローされます。

アセンブリ 'App_Web__ktsp_r0、バージョン = 0.0.0.0、カルチャ = ニュートラル、PublicKeyToken = null' から型 'MyService' を読み込めませんでした。

任意のガイダンスをいただければ幸いです。

0 投票する
2 に答える
4001 参照

.net - .NET イントロスペクション VS リフレクション

.NET のイントロスペクションとリフレクションの違いは何ですか

0 投票する
2 に答える
8315 参照

c# - .NET のスタック フレームからパラメーター値を取得しますか?

.NET のスタック フレームからすべてのパラメータ値を取得できるようにしたいと考えています。Visual Studio デバッガーでコール スタックの値を確認できる方法と少し似ています。私のアプローチは、StackFrame クラスを使用してから、 ParameterInfo配列に反映することに集中しています。リフレクションとプロパティで成功しましたが、これは少しトリッキーです。

これを達成するためのアプローチはありますか?

これまでのコードは次のようになります。

出力は次のようになります。

私はそれがもっとこのように見えることを望みます:


ちょっとした文脈のために、私の計画は、私自身の例外をスローするときにこれを試して使用することでした. 私はあなたの提案をより詳細に見て、それが適切であるかどうかを確認します.

0 投票する
2 に答える
3649 参照

c# - PropertyGrid、DefaultValueAttribute、動的オブジェクト、および列挙

注:私は.Net 1.1を使用していますが、より高いバージョンを使用する回答に完全に反対しているわけではありません。

PropertyGridに動的に生成されたオブジェクトを表示しています。これらのオブジェクトには、数値、テキスト、および列挙のプロパティがあります。現在、列挙のデフォルト値を設定して、リストで常に太字で表示されないようにするのに問題があります。列挙自体も動的に生成され、デフォルト値を除いて正常に機能しているように見えます。

最初に、エラーの原因となっている場合に列挙を生成する方法を示したいと思います。最初の行は、カスタムクラスを使用してデータベースをクエリします。この行をDataAdapterまたはデータベース値でDataSetを埋めるお好みの方法に置き換えるだけです。列1の文字列値を使用して列挙を作成しています。

次に、型の作成方法について説明します。これは主に、ここで提供されているサンプルコードに基づいています。基本的に、pFeatureをデータベース行と考えてください。列をループし、列名を新しいプロパティ名として使用し、列値をデフォルト値として使用します。それが少なくとも目標です。

最後に、そのタイプを使用してインスタンスを作成し、デフォルト値をロードして、後でPropertiesGridを使用して表示できるようにします。

ただし、列挙型のデフォルト値を取得しようとすると、エラーが発生します。DefaultValueAttribute dvaは設定されないため、使用しようとすると例外が発生します。

このコードセグメントを変更すると、次のようになります。

これに:

DefaultValueAttributedvaの取得に問題はありません。ただし、フィールドはデフォルト値と一致しないため、PropertiesGridで太字になっています。

生成された列挙にデフォルト値を設定したときにDefaultValueAttributeを取得できない理由を誰かが理解できますか?ご想像のとおり、私はまだReflectionを初めて使用するので、これはすべて私にとってかなり新しいことです。

ありがとう。

更新:alabamasucks.blogspotに応じて、ShouldSerializeを使用すると確かに私の問題は解決します。通常のクラスを使用してメソッドを作成することができました。ただし、生成されたタイプに対してこれを行う方法がわかりません。私が理解できることから、MethodBuilderを使用し、ILを生成して、フィールドがデフォルト値と等しいかどうかを確認する必要があります。簡単そうに聞こえます。これをILコードで表現したい:

同様のコードからildasm.exeを使用してILコードを取得できましたが、いくつか質問があります。ILコードでval変数を使用するにはどうすればよいですか?私の例では、値が0のintを使用しました。

ILにはタイプごとに異なるロードコマンドがあるため、これは確かに注意が必要です。現在、私はint、double、strings、およびenumerationsを使用しているため、コードはタイプに基づいて適応する必要があります。

誰かがこれを行う方法を知っていますか?それとも私は間違った方向に向かっていますか?

0 投票する
8 に答える
12604 参照

c# - 派生クラスから自動的に base.Dispose() を呼び出す

編集 - 新しい質問

わかりました、質問をより一般的に言い換えましょう。

リフレクションを使用して、オーバーライドしている可能性のある基本クラス メソッドを実行時に動的に呼び出す方法はありますか。'base' キーワードが存在することを確認できないため、コンパイル時には使用できません。実行時に祖先のメソッドを一覧表示し、祖先のメソッドを呼び出したいと思います。

GetMethods() などを使用してみましたが、返されるのはメソッドの最も派生した実装への「ポインター」だけです。基本クラスでの実装ではありません。

バックグラウンド

比較的大きなクラス階層を持つ C# 3.0 でシステムを開発しています。これらのクラスの一部は、階層内の任意の場所に、破棄する必要のあるリソースがあり、それらはIDisposableインターフェイスを実装しています。

問題

ここで、コードのメンテナンスとリファクタリングを容易にするために、IDisposable を実装するクラスについて、先祖も IDisposable を実装している場合にbase.Dispose(bDisposing)を「自動的に」呼び出す方法を見つけたいと思います。このようにして、階層の上位にあるクラスが IDisposable の実装を開始または停止した場合、自動的に処理されます。

問題は二重です。

  • まず、先祖が IDisposable を実装しているかどうかを調べます。
  • 次に、base.Dispose(bDisposing) を条件付きで呼び出します。

最初の部分では、先祖が IDisposable を実装していることを発見し、対処することができました。

2番目の部分はトリッキーです。すべての努力にもかかわらず、派生クラスから base.Dispose(bDisposing) を呼び出すことができませんでした。私の試みはすべて失敗しました。それらはコンパイル エラーを引き起こしたか、最も派生したメソッドである間違った Dispose() メソッドを呼び出したため、永遠にループしていました。

主な問題は、 base.Dispose()を実装する先祖などがない場合、コード内で直接base.Dispose() を実際に参照できないことです ( IDisposable をまだ実装している祖先がない可能性があることを思い出してください。ただし、派生コードを将来そのようなことが起こった場合に備えてください)。これでリフレクションメカニズムが残りましたが、それを行う適切な方法が見つかりませんでした。私たちのコードは高度なリフレクション テクニックでいっぱいで、明らかな見落としはなかったと思います。

私の解決策

私の最善の策は、コメント付きのコードで使用する条件付きコードをいくつか用意することでした。IDisposable 階層を変更すると、ビルドが中断されるか (IDisposable の祖先が存在しない場合)、例外がスローされます (IDisposable の祖先が存在するが base.Dispose が呼び出されない場合)。

Dispose(bDisposing) メソッドがどのように見えるかを示すために投稿しているコードを次に示します。このコードを、階層全体のすべての Dispose() メソッドの最後に配置しています。新しいクラスは、このコードも含むテンプレートから作成されます。

だから、代わりに base.Dispose() を自動的に/条件付きで呼び出す方法はありますか?

その他の背景

アプリケーションには、すべてのオブジェクトがメイン クラスに登録される別のメカニズムがあります。クラスは、IDisposable を実装しているかどうかを確認します。その場合、それらはアプリケーションによって適切に破棄されます。これにより、コードがクラスを使用して Dispose() の呼び出しを処理する必要がなくなります。したがって、IDisposable の先祖の履歴がないクラスに IDisposable を追加しても、完全に機能します。

0 投票する
11 に答える
190004 参照

c# - リフレクションを介して名前空間内のすべての型を取得する

C# でリフレクションを使用して名前空間内のすべてのクラスを取得するにはどうすればよいですか?

0 投票する
6 に答える
23091 参照

c# - リフレクションによるインターフェースの実装

C# でリフレクションを介してインターフェイスのすべての実装を取得するにはどうすればよいですか?