![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
お世話になっております。
C#のリフレクションについて質問です。
現在あるジェネリック型クラスからプロパティを取得する仕組みを構築しております。
ジェネリック型クラスは元々普通のクラス構造を持っており、以下のような内容です。
------------------
class A
{
public List<XX> obj1 { get; set; }; // XXはクラス型
public List<ZZ> obj2 { get; set; }; // ZZはクラス型
}
------------------
このデータを渡された側は、ジェネリック型のためクラスの構造は不明。
その為、以下のように「class A」とそのプロパティの内容を特定しました。
------------------
var type = typeof(T);
List<PropertyInfo> infos = type.GetProperties().ToList();
------------------
ただ、ここからが問題となっており、「class A」の「obj1」「obj2」プロパティのクラス構造を解析しようとして、同様に上記infosに対して「type.GetProperties().ToList();」を実行してみたところ、元々infosが「PropertyInfo」型なので、そちらのメンバが取得されてしまいます。
説明がややこしくて申し訳ありませんが、このような状況下で「obj1」「obj2」のクラス構造を解析することは可能でしょうか?
お手数ですが、よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
データ型がジェネリック型の場合は、ジェネリック型である判断の後に、ジェネリック型の型引数を取得して、そのTypeからプロパティなどを得る形になります。
foreach (var pi in infos) {
if (pi.PropertyType.IsGenericType) {
foreach (var genericType in pi.PropertyType.GenericTypeArguments) {
var gpis = genericType.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty);
foreach (var gpi in gpis)
{
System.Windows.Forms.MessageBox.Show(gpi.ToString());
}
}
}
}
当然、そのプロパティがまたジェネリック型である可能性もあるため、配下すべてを走査するようなことを想定していると、必然的に再帰になります。
また、プロパティなどの作られ方によってはクラスを循環する可能性もあるため、無限ループに陥る可能性があります。
2階層目までしか走査しないとか、特定の属性が含まれるものだけ走査するとか、何か考えないといけません。
ありがとうございます。
「genericType in pi.PropertyType.GenericTypeArguments」の部分は非常に参考になりました。
頂いたソースコードを参考にしながら解決に至りました。
ありがとうございました。
No.1
- 回答日時:
素人ですが.
現状でどう書いていてなにが問題になっているのか見えてこないんですが.... とりあえず「同様に~取得されてしまいます」のところが「どんなコードでどう『期待通りでない』のかが」わからんです. 少なくとも
例えば infos[0].GetType() に対して GetProperties なんかをやったらマズい
ことはわかるんですが, さすがにそんなことはしてないでしょうし. あるいは「それぞれのプロパティの型をどうやって見付ければいいかわからない」なんてことも... ありえないよなぁ. それだったら「ジェネリック型」とか持ち出すまでもなくアウトだし....
「XXはクラス型」の部分も, クラスA 自身が (XX を型パラメータに持つ) ジェネリック型なのかそれとも「XX という型自体は別のところで定義されている」のかがわからんです.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- C言語・C++・C# クラスのメンバ変数を基準に並べ替えをしたい 5 2022/12/25 17:40
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- HTML・CSS CSS のみのタブ切り替えについて 1 2023/01/11 16:47
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- 野球 今年の巨人はBクラス 1 2022/07/02 21:37
- Java リレーションエンティティクラスとは何ですか? 2 2023/02/10 00:02
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
グローバルIPとプライベートIP...
-
java eclipse 型に解決できません
-
配列の重複する値とその個数を...
-
Java「デフォルトのパッケージ...
-
「天声人語」をインターネット...
-
Javaでの構造体の構造体のクラ...
-
UMLのクラス図はmain()も含むん...
-
ATLとMFCの違いは何でしょうか?
-
同じパッケージ、クラス名が含...
-
自作のクラスファイルがインポ...
-
共通で使う関数を集めたクラス...
-
重複エラーを解決するには
-
クラスのプロパティに構造体を...
-
正規表現を使った小数入力チェ...
-
IPアドレスのクラスAを取得して...
-
1 つのヘッダファイルに複数の...
-
IPアドレスの3バイト目の呼び方
-
同じクラスにならない確率を教...
-
3年間同じクラスになる確率
-
河合塾のクラス分けについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
グローバルIPとプライベートIP...
-
配列の重複する値とその個数を...
-
java eclipse 型に解決できません
-
「天声人語」をインターネット...
-
オブジェクト指向プログラミン...
-
同一パッケージにあるクラスが...
-
SQLです教えてくださいお願いし...
-
自作のクラスファイルがインポ...
-
packageとimport の違いって?
-
重複エラーを解決するには
-
1 つのヘッダファイルに複数の...
-
UMLのクラス図はmain()も含むん...
-
main()を持つクラスが2つ以上...
-
3年間同じクラスになる確率
-
河合塾のクラス分けについて
-
EclipseでJSPのコンパイルエラー
-
どこからも呼ばれていない無意...
-
IPアドレスの3バイト目の呼び方
-
同じクラスにならない確率を教...
-
IPアドレスのクラスAを取得して...
おすすめ情報