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

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



10
Pythonクラスを動的にロードする方法
たとえばPythonクラスの文字列が与えられた場合、my_package.my_module.MyClassそれをロードする最良の方法は何ですか? 言い換えれば、私はClass.forName()JavaでPythonの関数で同等のものを探しています。Google App Engineで動作する必要があります。 これは、クラスのFQNを文字列として受け入れ、クラスへの参照を返す関数であることが望ましいです。 my_class = load_class('my_package.my_module.MyClass') my_instance = my_class()

1
Attributes.IsDefined()にオーバーロードがないのはなぜですか?
SOの質問に触発されました。Attributeクラスには、IsDefined()メソッド用のいくつかのオーバーロードがあります。対象となるのは、Assembly、Module、MemberInfo、ParameterInfoに適用される属性です。MemberInfoオーバーロードは、PropertyInfo、FieldInfo、EventInfo、MethodInfo、ConstructorInfoをカバーします。 これで、ほとんどのAttributeTargetsが処理されます。1つの大きな違いを除いて:Attribute.IsDefined(Type、Type)のオーバーロードがないため、属性がクラスで定義されているかどうかを確認できます。または、その問題の構造体、委任、または列挙型。 これが実際の問題ではないため、Type.GetCustomAttributes()で修正できます。しかし、すべてのBlahInfoタイプにもこれがあります。対称性の欠如に疑問を感じます。なぜこれがTypeの問題になるのか、はっきりとは言えません。継承の問題を推測しても、それは説明できません。ValueTypeを組み合わせることはリードになるかもしれませんが、それでも意味がありません。私は「彼らが忘れた」を買わない、彼らは決して買わない。 このオーバーロードが欠落しているのはなぜですか?
165 c#  .net  reflection 

4
Javaクラスで宣言された静的フィールドのみを取得する
次のクラスがあります。 public class Test { public static int a = 0; public int b = 1; } リフレクションを使用して静的フィールドのみのリストを取得することは可能ですか?私はすべてのフィールドの配列をで取得できることを知っていますTest.class.getDeclaredFields()。しかし、Fieldインスタンスが静的フィールドを表すかどうかを判断する方法はないようです。
163 java  reflection  static  field 

12
タイプがプリミティブかどうかをテストする方法
タイプをHtmlタグにシリアル化するコードのブロックがあります。 Type t = typeof(T); // I pass <T> in as a paramter, where myObj is of type T tagBuilder.Attributes.Add("class", t.Name); foreach (PropertyInfo prop in t.GetProperties()) { object propValue = prop.GetValue(myObj, null); string stringValue = propValue != null ? propValue.ToString() : String.Empty; tagBuilder.Attributes.Add(prop.Name, stringValue); } 私はそれが唯一のプリミティブ型、などのためにこれをしたい除いて、これは素晴らしい作品int、double、bool原始的ではないが、同様に簡単にシリアル化できるなど、および他のタイプstring。リストやその他のカスタムタイプなど、他のすべてを無視するようにします。 誰も私がこれをどのように行うか提案できますか?または、どこかで許可するタイプを指定し、プロパティのタイプをオンにして、許可されているかどうかを確認する必要がありますか?それは少し面倒なので、私がもっときちんとした方法があったらいいでしょう。


4
オブジェクトに特定のメソッド/プロパティがあるかどうかを確認するにはどうすればよいですか?
おそらく動的パターンを使用していますか?動的キーワードを使用して、任意のメソッド/プロパティを呼び出すことができますよね?たとえば、myDynamicObject.DoStuff()を呼び出す前にメソッドが存在するかどうかを確認する方法は?

15
C#でメソッド呼び出しをインターセプトするにはどうすればよいですか?
特定のクラスについて、トレース機能を使用したいと考えています。つまり、すべてのメソッド呼び出し(メソッドシグネチャと実際のパラメーター値)とすべてのメソッド出口(メソッドシグネチャのみ)をログに記録したいと考えています。 次のことを前提としてこれをどのように達成しますか: C#にサードパーティのAOPライブラリを使用したくありません。 追跡したいすべてのメソッドに重複したコードを追加したくありません。 クラスのパブリックAPIを変更したくありません。クラスのユーザーは、すべてのメソッドをまったく同じ方法で呼び出すことができるはずです。 質問をより具体的にするために、3つのクラスがあると仮定しましょう。 public class Caller { public static void Call() { Traced traced = new Traced(); traced.Method1(); traced.Method2(); } } public class Traced { public void Method1(String name, Int32 value) { } public void Method2(Object object) { } } public class Logger { public static void …
154 c#  reflection  aop 


13
不明なオブジェクトからプロパティと値を取得する
PHPの世界から、C#を試すことにしました。私は検索をしましたが、これと同等のことをする方法の答えを見つけることができないようです。 $object = new Object(); $vars = get_class_vars(get_class($object)); foreach($vars as $var) { doSomething($object->$var); } 基本的にオブジェクトのリストがあります。オブジェクトは3つの異なるタイプのいずれかであり、一連のパブリックプロパティを持ちます。オブジェクトのプロパティのリストを取得し、それらをループしてファイルに書き込めるようにしたいのですが。これはc#リフレクションに関係していると思いますが、それは私にとってすべて新しいものです。 どんな助けでも大歓迎です。
150 c#  reflection 

5
Pythonコードの行は、インデントのネストレベルを知ることができますか?
このようなものから: print(get_indentation_level()) print(get_indentation_level()) print(get_indentation_level()) 私はこのようなものを手に入れたいです: 1 2 3 この方法でコードを読み取ることができますか? 私が欲しいのは、コードのよりネストされた部分からの出力がよりネストされることです。これによりコードが読みやすくなるのと同じように、出力も読みやすくなります。 もちろん、たとえばを使用してこれを手動で実装することもできます.format()が、私が念頭に置いていたのは、インデントレベルがprint(i*' ' + string)どこにあるかというカスタムの印刷関数でしたi。これは、私の端末で読みやすい出力を作成する簡単な方法です。 これを行うための手作業でのフォーマットの手間を省くより良い方法はありますか?

7
名前に基づいてプロパティ値を取得する方法
名前に基づいてオブジェクトのプロパティの値を取得する方法はありますか? たとえば、私が持っている場合: public class Car : Vehicle { public string Make { get; set; } } そして var car = new Car { Make="Ford" }; プロパティ名を渡してプロパティ値を返すメソッドを記述したいと思います。つまり: public string GetPropertyValue(string propertyName) { return the value of the property; }
147 c#  asp.net  reflection 

13
実行時に、基本クラスを拡張するJavaアプリケーション内のすべてのクラスを検索します
私はこのようなことをしたいです: List<Animal> animals = new ArrayList<Animal>(); for( Class c: list_of_all_classes_available_to_my_app() ) if (c is Animal) animals.add( new c() ); そのため、アプリケーションのユニバース内のすべてのクラスを確認し、Animalから派生したクラスを見つけたら、そのタイプの新しいオブジェクトを作成してリストに追加します。これにより、リストを更新しなくても機能を追加できます。以下を回避できます。 List<Animal> animals = new ArrayList<Animal>(); animals.add( new Dog() ); animals.add( new Cat() ); animals.add( new Donkey() ); ... 上記のアプローチでは、Animalを拡張する新しいクラスを作成するだけで、自動的に取得されます。 更新:2008/10/16太平洋標準時午前9:00: この質問により多くの素晴らしい回答が得られました。ありがとうございました。 回答と私の調査から、私が本当にやりたいことは、Javaでは不可能であることがわかりました。ddimitrovのServiceLoaderメカニズムなど、機能するアプローチはいくつかありますが、私が望むものには非常に重く、問題をJavaコードから外部構成ファイルに移すだけだと思います。 19年5月10日更新(11年後!)@IvanNikの回答に よると、これに役立つライブラリがいくつかありますorg.reflectionsは良さそうです。またClassGraph @Lukeハチソンさんからの答えは面白そうですね。答えにはさらにいくつかの可能性があります。 私が望むものを述べる別の方法:私のAnimalクラスの静的関数は、追加の構成/コーディングなしで、Animalから継承するすべてのクラスを見つけてインスタンス化します。構成する必要がある場合は、いずれにしても、Animalクラスでインスタンス化するだけで済みます。Javaプログラムは.classファイルの緩やかな連合なので、それがそのままの方法であることは理解しています。 興味深いことに、これはC#ではかなり簡単なようです。


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