問題タブ [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.
c# - C# でオブジェクトがディクショナリかどうかをテストする
オブジェクトが辞書かどうかをテストする方法はありますか?
メソッドで、リスト ボックスで選択した項目から値を取得しようとしています。状況によっては、リスト ボックスがディクショナリにバインドされることがありますが、これはコンパイル時にはわかりません。
私はこれに似たようなことをしたいと思います:
リフレクションを使用して実行時にこれを動的に行う方法はありますか? ジェネリック型でリフレクションを使用してキー/値パラメーターを決定できることはわかっていますが、それらの値を取得した後に残りを行う方法があるかどうかはわかりません。
.net - 既存の .NET アセンブリの変更
サードパーティのツールに頼らずに、既存の .NET アセンブリを変更する方法はありますか? PostSharpがこれを可能にしていることは知っていますが、PostSharp の開発者System.Reflection
が既存のアセンブリを変更可能にするために基本的に名前空間全体の機能を書き直さなければならなかったのは非常に無駄だと思います。
System.Reflection.Emit
新しい動的アセンブリの作成のみを許可します。ただし、ここで使用されるすべてのビルダー クラスは、基本的なリフレクション クラスから継承されます (たとえばTypeBuilder
、から継承されSystem.Type
ます)。残念ながら、既存の動的に読み込まれた型を型ビルダーに強制する方法はないようです。少なくとも、公式にサポートされている方法はありません。
では、サポートされていない場合はどうでしょうか。既存のアセンブリまたは型をそのようなビルダー クラスにロードできるバックドアを知っている人はいますか?
注意してください、私は現在のアセンブリを変更する方法を探しているのではなく(これは不合理な要求かもしれません)、ディスクからロードされた既存のアセンブリを変更するだけです。そのようなことはないと思いますが、とにかくお聞きしたいです。
最悪の場合、ildasm.exe
コードを逆アセンブルしてからilasm.exe
再アセンブルする必要がありますが、IL データを操作するためのツールチェーン (読み: IL リーダー) が .NET に含まれていません (またはありますか?)。
/編集:
特定のユースケースはありません。既存のアセンブリにパッチを適用することは非常に一般的なタスクであるため、汎用ソリューションに興味があります。たとえば、難読化ツール、プロファイラー、または AOP ライブラリを考えてみましょう (そうです、後者は別の方法で実装できます)。すでに述べたように、既存のインフラストラクチャの大部分をSystem.Reflection
.
@ウェッジ:
あなたが正しい。ただし、ここでは特定の使用例はありません。これを反映するように元の質問を変更しました。Lutz Roeder の Reflector が (VB または C#) ソース コードをリエンジニアリングするのを防ぐために、質問者がどのように命令pop
を挿入し、すべてのメソッドの最後に挿入できるかを知りたがっていたという別の質問によって、私の興味がかき立てられました。ret
現在、このシナリオは、前述の PostSharp や、 Cecilライブラリを使用する Reflector 用のReflexilプラグインなど、多くのツールで実現できます。
全体として、私は .NET フレームワークに満足していません。
@ジョエル:
はい、私はこの制限を認識しています。重要なことなので、とにかく指摘してくれてありがとう。
@マルキシダード:
これが唯一の実行可能なアプローチのようです。ただし、これは、ビルダー クラスを使用して完全なアセンブリを再作成する必要があることを意味しますよね? つまり、アセンブリ全体を手動で調べる必要があります。
うーん、調べてみます。
.net - .Net を使用して、型が Numeric ValueType かどうかを判断するにはどうすればよいですか?
しかし、ここに例があります:
編集:文字列としての値ではなく、型のみを知っています。
残念ながら、TypeCode を循環する必要があります。
しかし、これはそれを行うための良い方法です:
java - Java equals():反映するか反映しないか
この質問は、特に、多数のフィールドを持つオブジェクトのequals()メソッドのオーバーライドに関連しています。まず、この大きなオブジェクトは、オブジェクト指向の原則に違反せずに複数のコンポーネントに分割することはできないため、「xフィールドを超えるクラスはありません」と言っても役に立ちません。
次に、フィールドの1つが等しいかどうかを確認するのを忘れたときに、問題が発生しました。したがって、私のequalsメソッドは正しくありませんでした。それから私はリフレクションを使うことを考えました:
この投稿の目的は、必ずしもコードをリファクタリングすることではなく(これは、私が使用しているコードでもありません)、代わりに、これが良いアイデアであるかどうかについての入力を取得することです。
長所:
- 新しいフィールドが追加されると、自動的に含まれます
- このメソッドは、30ifステートメントよりもはるかに簡潔です。
短所:
- 新しいフィールドが追加されると、それは自動的に含まれますが、これは望ましくない場合があります
- パフォーマンス:これは遅くする必要があります。プロファイラーを分割する必要はありません。
- 比較で無視する特定のフィールドをホワイトリストに登録するのは少し醜いです
何かご意見は?
java - 要求されたクラスとはまったく異なるクラスを返す Java ClassLoader を定義することは可能ですか?
私はこれを試しましたが、呼び出し時に ClassNotFoundException を取得します:
c# - タイプメンバーのソースファイル名と行番号を取得するにはどうすればよいですか?
デバッグデータファイルが利用可能(PDB)であり、System.ReflectionまたはMono.Cecilなどの別の同様のフレームワークを使用することを考慮して、タイプまたはタイプのメンバーが存在するソースファイル名と行番号をプログラムで取得する方法宣言しました。
たとえば、このファイルをアセンブリにコンパイルしたとします。
C:\ MyProject \ Foo.cs
次のようなことを行う方法:
sourceFileNameには「C:\ MyProject \ Foo.cs」が含まれ、sourceLineNumberは3に等しくなります。
更新:System.Diagnostics.StackFrame
確かにその情報を取得できますが、現在実行中の呼び出しスタックの範囲内でのみです。これは、メソッドを最初に呼び出す必要があることを意味します。同じ情報を取得したいのですが、タイプメンバーを呼び出さないでください。
c# - 特定のタイプ (System.Type) が特定の基本クラス (.Net) から継承されているかどうかをどのように判断しますか?
これは簡単な答えになる可能性が高く、何かが欠けているだけですが、ここに行きます...タイプがある場合(つまり、実際のSystem.Type ...インスタンスではありません)、別の特定の基本型から継承しますか?
.net - その名前からジェネリックをインスタンス化する最良の方法は何ですか?
"MyCustomGenericCollection(of MyCustomObjectClass)" の形式の文字列としてジェネリックのクラス名しかなく、その元のアセンブリがわからない場合、そのオブジェクトのインスタンスを作成する最も簡単な方法は何ですか?
それが役に立てば、クラスが IMyCustomInterface を実装し、現在の AppDomain に読み込まれたアセンブリからのものであることがわかります。
Markus Olsson はここで優れた例を示しましたが、それをジェネリックに適用する方法がわかりません。
asp.net - メソッド「XYZ」を反映できません
サード パーティの Web サービスを使用しており、ASP.NET Web アプリケーションからそれを呼び出そうとしています。ただし、Web サービスをインスタンス化すると、次の System.InvalidOperationException 例外がスローされます。
メソッド「ABC.XYZ」は反映できません。System.InvalidOperationException: メソッド 'ABC.XYZ' を反映できません。---> System.InvalidOperationException: 名前空間 ' http://mysoftware.com/ns 'の XML 要素 'MyDoc'がメソッドと型を参照しています。WebMethodAttribute を使用してメソッドのメッセージ名を変更するか、XmlRootAttribute を使用して型のルート要素を変更します。
私が収集できることから、Web サービスのメソッドと型の間にはあいまいな点があるようです。誰でもこの例外の原因を明確にすることができますか?これを修正するために私にできることはありますか?それとも Web サービスの所有者に連絡して修正する必要がありますか?
編集: Visual Studio 2008 はプロキシ クラスを作成しました。残念ながら、wsdl はローカルにインストールされたサード パーティ製アプリの Web サービスであるため、wsdl へのリンクを提供できません。
.net - リフレクションを使用して、構築されたサブクラス化されたタイプのコレクションを取得する
IEnumerable <T>を実装するクラスを作成したいのですが、リフレクションを使用してTを生成し、IEnumerable <T>を介して返します。ここで、T'は完全に構築されたTのサブクラスであり、一部のプロパティは非表示で、他のプロパティは読み取り専用です。
わかりました、それはあまり明確ではないかもしれません。これをコードの媒体で説明しましょう-次のようにCollectionView<T>クラスを作成したいと思います:-
(dataGridView1に表示されると、列BとCが表示され、Cには読み取り専用の基になるストアがあります)
これは可能/望ましいですか、それとも私は完全に頭がおかしくなっていますか/この質問はプログラマーとしての私の深い不十分さを示していますか?
これを実行して、DataGridViewを直接操作して列を非表示にしたり、列を読み取り専用にすることなく、DataGridViewに渡されるコレクションを操作できるようにします。したがって、「ああ、dataGridView1.Columns.Remove(blah)/ dataGridView1.Columns [blah] .ReadOnly=true」の答えを使用してください!!
ヘルプ!