タグ付けされた質問 「reflection」

リフレクションは、実行時にプログラムの構造や動作を観察および/または変更するプログラムの機能です。リフレクションは、サポートするプログラミング言語に依存しています。このタグを使用する場合は、使用しているプログラミング言語にタグを付けてください。

10
c#で動的匿名型にプロパティが存在するかどうかを確認するにはどうすればよいですか?
プロパティからチェックインしたいメソッドから動的として受け取る匿名タイプのオブジェクトがそのオブジェクトに存在します。 .... var settings = new { Filename="temp.txt", Size=10 } ... function void Settings(dynamic settings) { var exists = IsSettingExist(settings,"Filename") } IsSettingExistはどのように実装しますか?

1
あいまいな一致例外を回避する
コンパイル時にオブジェクトの型がわからないため、リフレクションを介して型に対して静的メソッドParseを呼び出しています(ただし、文字列をとるParseメソッドがあります)。 ただし、おそらく単一のオブジェクト(string、int、doubleなど)をとるオーバーロードされたParseメソッドがたくさんあるため、あいまいな一致例外が発生します。 正しいメソッド(Parse(string s))に到達し、例外がスローされないようにするために、メソッド呼び出しをより具体的にする方法を教えてください。 私のコードは次のようになります: Type returnType = p.PropertyType; object value = returnType.GetMethod("Parse").Invoke(null, new string[] { "1" });

8
リフレクションを使用してC#のプライベートな読み取り専用フィールドを変更できますか?
リフレクションを使用して多くのことができるので、コンストラクターの実行が完了した後でプライベート読み取り専用フィールドを変更できますか? (注:単なる好奇心) public class Foo { private readonly int bar; public Foo(int num) { bar = num; } public int GetBar() { return bar; } } Foo foo = new Foo(123); Console.WriteLine(foo.GetBar()); // display 123 // reflection code here... Console.WriteLine(foo.GetBar()); // display 456
115 c#  reflection  field  readonly 

18
オブジェクトがプリミティブ型かどうかの判別
私が持っているObject[]配列を、と私はプリミティブなものを見つけようとしています。を使用しようとしましたがClass.isPrimitive()、何か間違っているようです: int i = 3; Object o = i; System.out.println(o.getClass().getName() + ", " + o.getClass().isPrimitive()); プリントjava.lang.Integer, false。 正しい方法または代替手段はありますか?
114 java  reflection 


8
すべての参照を含むアセンブリをAppDomainに再帰的に読み込む方法は?
AppDomain複雑な参照ツリーを持つ新しいいくつかのアセンブリにロードしたい(MyDll.dll-> Microsoft.Office.Interop.Excel.dll-> Microsoft.Vbe.Interop.dll-> Office.dll-> stdole.dll) 私が理解している限り、アセンブリがに読み込まれているときAppDomain、その参照は自動的に読み込まれず、手動で読み込む必要があります。だから私がするとき: string dir = @"SomePath"; // different from AppDomain.CurrentDomain.BaseDirectory string path = System.IO.Path.Combine(dir, "MyDll.dll"); AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation; setup.ApplicationBase = dir; AppDomain domain = AppDomain.CreateDomain("SomeAppDomain", null, setup); domain.Load(AssemblyName.GetAssemblyName(path)); そして得たFileNotFoundException: ファイルまたはアセンブリ 'MyDll、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = null'またはその依存関係の1つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。 重要な部分は依存関係の1つだと思います。 はい、前に行います domain.Load(AssemblyName.GetAssemblyName(path)); foreach (AssemblyName refAsmName in Assembly.ReflectionOnlyLoadFrom(path).GetReferencedAssemblies()) …

3
クラスが定義されたPHPファイル(実行時)の検索
特定のクラス(または関数)が定義されたPHPファイルを見つけることができるPHPのリフレクション/イントロスペクション/マジックはありますか? 言い換えれば、私はPHPクラス、またはインスタンス化されたオブジェクトの名前を持っています。これを、クラスが定義されたファイルシステムパスを返すもの(関数、Reflectionクラスなど)に渡したいと思います。 /path/to/class/definition.php (get_included_files())これまでに含まれているすべてのファイルのリストを取得し、それらをすべて手動で解析するために)を使用できることはわかっていますが、これは1回の試行で多くのファイルシステムにアクセスできます。 また、この情報をどこかにキャッシュする__autoloadメカニズムにいくつかの追加コードを記述できることも理解しています。ただし、私が考えている状況では、既存の__autoloadを変更することは禁止されています。 これを行うことができる拡張機能について聞くのは興味深いでしょうが、私は最終的には「ストック」インストールで実行できるものを望んでいます。
111 php  reflection  class 

3
リフレクションで静的メソッドを呼び出す
私は名前空間にいくつかの静的なクラスを持っているmySolution.Macrosような static class Indent{ public static void Run(){ // implementation } // other helper methods } だから私の質問は、リフレクションの助けを借りてそれらのメソッドを呼び出すことがどのように可能になるのでしょうか? メソッドが静的でない場合は、次のようなことができます: var macroClasses = Assembly.GetExecutingAssembly().GetTypes().Where( x => x.Namespace.ToUpper().Contains("MACRO") ); foreach (var tempClass in macroClasses) { var curInsance = Activator.CreateInstance(tempClass); // I know have an instance of a macro and will be able to …
111 c#  reflection  dynamic 


8
リフレクションで静的プロパティを取得する方法
したがって、これはかなり基本的なように見えますが、機能させることができません。オブジェクトがあり、リフレクションを使用してそのパブリックプロパティにアクセスしています。これらのプロパティの1つは静的であり、私はそれに到達することができません。 Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo Return obj.GetType.GetProperty(propName) End Function 上記のコードは、パブリックインスタンスのプロパティで問題なく機能します。おそらく、BindingFlagsを使用して他の種類のプロパティ(プライベート、静的)を要求できますが、適切な組み合わせを見つけることができないようです。 Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo Return obj.GetType.GetProperty(propName, Reflection.BindingFlags.Static Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public) End Function ただし、静的メンバーを要求しても何も返されません。.NETリフレクターは静的プロパティを正常に表示できるため、ここで何かが欠けています。
109 .net  reflection  static 

8
設計時にvarを使用して宣言された変数の型を確実に判断するにはどうすればよいですか?
私はemacsでC#の補完(インテリセンス)機能に取り組んでいます。 ユーザーがフラグメントを入力し、特定のキーストロークの組み合わせを介して補完を要求すると、補完機能は.NETリフレクションを使用して可能な補完を決定するという考え方です。 これを行うには、完成するものの種類を知っている必要があります。文字列の場合、考えられるメソッドとプロパティの既知のセットがあります。それがInt32の場合は、別個のセットがあります。 emacsで利用可能なコードレクサー/パーサーパッケージのセマンティックを使用して、変数宣言とその型を見つけることができます。そのため、リフレクションを使用して型のメソッドとプロパティを取得し、オプションのリストをユーザーに提示するのは簡単です。(OK、emacs 内で実行するのは簡単ではありませんが、 emacs 内でpowershellプロセスを実行する機能を使用すると、はるかに簡単になります。リフレクションを実行するためのカスタム.NETアセンブリを記述し、それをpowershellにロードしてから、elisp内で実行しますemacsはコマンドをpowershellに送信し、comintを介して応答を読み取ることができます。その結果、emacsはリフレクションの結果をすばやく取得できます。) 問題varは、完了したものの宣言でコードが使用するときに発生します。つまり、タイプが明示的に指定されておらず、補完が機能しません。 変数がvarキーワードで宣言されている場合、実際に使用されているタイプを確実に判断するにはどうすればよいですか?明確にするために、実行時にそれを決定する必要はありません。「設計時」に決定したい。 これまでのところ、私はこれらのアイデアを持っています: コンパイルして呼び出す: 宣言ステートメントを抽出します。例: `var foo =" a string value ";` ステートメント `foo.GetType();`を連結します 結果のC#フラグメントを動的にコンパイルして新しいアセンブリに アセンブリを新しいAppDomainに読み込み、フレームを実行して戻り値の型を取得します。 アセンブリをアンロードして破棄する 私はこれをすべて行う方法を知っています。しかし、エディターでの完了要求ごとに、それはひどく重いように聞こえます。 私は毎回新しいAppDomainを必要としないと思います。単一のAppDomainを複数の一時的なアセンブリに再利用し、複数の完了リクエストにまたがって、それを設定および破棄するコストを償却できます。これは、基本的な考え方の微調整です。 ILのコンパイルと検査 宣言をモジュールにコンパイルし、ILを検査して、コンパイラーによって推論された実際のタイプを判別します。これはどのようにして可能でしょうか?ILの検査には何を使用しますか? そこにもっと良いアイデアはありますか?コメント?提案? 編集 -これについてさらに考えると、コンパイルと呼び出しは受け入れられません。呼び出しには副作用がある可能性があるためです。したがって、最初のオプションは除外する必要があります。 また、.NET 4.0の存在は想定できません。 更新 -正解は、上記には言及されていませんが、エリックリッパートによって穏やかに指摘されていますが、完全な忠実度の型推論システムを実装することです。これは、設計時に変数のタイプを確実に決定する唯一の方法です。しかし、それも簡単ではありません。私はそのようなものを構築したいという幻想に苦しんでいないので、オプション2のショートカットをとりました-関連する宣言コードを抽出してコンパイルし、結果のILを検査します。 これは、完了シナリオのかなりのサブセットに対して実際に機能します。 たとえば、次のコードフラグメントで、?ユーザーが完了を要求する位置です。これは機能します: var x = "hello there"; x.? 補完により、xは文字列であることがわかり、適切なオプションが提供されます。これは、次のソースコードを生成してコンパイルすることによって行われます。 namespace N1 { static class dmriiann5he …

2
PropertyInfoを使用してプロパティタイプを見つける
オブジェクトツリーを動的に解析して、カスタム検証を行います。検証自体は重要ではありませんが、PropertyInfoクラスをよりよく理解したいと思います。 私はこのようなことをします、 public bool ValidateData(object data) { foreach (PropertyInfo propertyInfo in data.GetType().GetProperties()) { if (the property is a string) { string value = propertyInfo.GetValue(data, null); if value is not OK { return false; } } } return true; } 本当に今気になっているのは「プロパティが文字列の場合」だけです。PropertyInfoオブジェクトからそれがどのタイプであるかをどのように確認できますか 文字列、int、doubleなどの基本的なものを処理する必要があります。ただし、オブジェクトも処理する必要があるため、オブジェクトツリー内をさらに移動して、オブジェクト内の基本データを検証する必要がある場合は、オブジェクトにも文字列などが含まれます。 ありがとう。
108 c#  .net  reflection 

15
整数から長整数への変換
リフレクションを使用してフィールドの値を取得する必要があります。たまたま、フィールドのデータ型が何であるかが常にわかりません。そのため、またコードの重複を避けるために、次のメソッドを作成しました。 @SuppressWarnings("unchecked") private static <T> T getValueByReflection(VarInfo var, Class<?> classUnderTest, Object runtimeInstance) throws Throwable { Field f = classUnderTest.getDeclaredField(processFieldName(var)); f.setAccessible(true); T value = (T) f.get(runtimeInstance); return value; } そして、この方法を次のように使用します: Long value1 = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance); または Double[] value2 = getValueByReflection(inv.var2(), classUnderTest, runtimeInstance); 問題は、私がキャストIntegerすることができないようですLong: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long …
108 java  reflection  casting 


2
リフレクトを使用して、構造体フィールドの値をどのように設定しますか?
reflectパッケージを使用して構造体フィールドを操作するのに大まかな時間がかかります。特に、フィールド値の設定方法を理解していません。 タイプt構造体{fi int; fs string} var rt = t {123、 "jblow"} var i64 int64 = 456 フィールド名iを取得-これは動作するようです var field = reflect.TypeOf(r).Field(i).Name フィールドiの値をa)インターフェイス{}、b)intとして取得-これは機能するようです var iface interface{} = reflect.ValueOf(r).Field(i).Interface() var i int = int(reflect.ValueOf(r).Field(i).Int()) フィールドiの値の設定-1つ試す-パニック reflect.ValueOf(r).Field(i).SetInt( i64 ) panic:エクスポートされていないフィールドを使用して取得した値を使用するreflect.Value・SetInt フィールド名「id」と「name」が好きではなかったので、「Id」と「Name」に名前が変更されました a)この仮定は正しいですか? b)正しい場合、同じファイル/パッケージ内にあるため必要ではないと考えた フィールドiの値を設定-2つ試す(フィールド名を大文字にして)-パニック reflect.ValueOf(r).Field(i).SetInt( 465 ) reflect.ValueOf(r).Field(i).SetInt( i64 ) panic:reflect.Value・アドレス指定不可能な値を使用したSetInt @peterSOによる以下の指示は、徹底的で高品質です 四。これは機能します: …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.