dポイントプレゼントキャンペーン実施中!

お世話になっております。

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」のクラス構造を解析することは可能でしょうか?

お手数ですが、よろしくお願いいたします。

A 回答 (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階層目までしか走査しないとか、特定の属性が含まれるものだけ走査するとか、何か考えないといけません。
    • good
    • 0
この回答へのお礼

ありがとうございます。

「genericType in pi.PropertyType.GenericTypeArguments」の部分は非常に参考になりました。

頂いたソースコードを参考にしながら解決に至りました。
ありがとうございました。

お礼日時:2021/02/05 09:19

素人ですが.



現状でどう書いていてなにが問題になっているのか見えてこないんですが.... とりあえず「同様に~取得されてしまいます」のところが「どんなコードでどう『期待通りでない』のかが」わからんです. 少なくとも
例えば infos[0].GetType() に対して GetProperties なんかをやったらマズい
ことはわかるんですが, さすがにそんなことはしてないでしょうし. あるいは「それぞれのプロパティの型をどうやって見付ければいいかわからない」なんてことも... ありえないよなぁ. それだったら「ジェネリック型」とか持ち出すまでもなくアウトだし....

「XXはクラス型」の部分も, クラスA 自身が (XX を型パラメータに持つ) ジェネリック型なのかそれとも「XX という型自体は別のところで定義されている」のかがわからんです.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!