「エントリ ポイント」が階層の「最上位」にあると仮定すると (例:Class1
やClass2
)、提案されたビジター パターンと同様のことを行ういくつかの拡張メソッドを考えることができます。
public static class FieldAndTypeExtensions {
public static IEnumerable<FieldInfo> walk(this Type t) {
foreach (FieldInfo f in t.GetFields()) {
foreach (FieldInfo nextField in f.walk()) {
yield return nextField;
}
}
}
public static IEnumerable<FieldInfo> walk(this FieldInfo f) {
yield return f;
FieldInfo[] fieldInfos = f.FieldType.GetFields();
foreach (FieldInfo nextField in fieldInfos) {
foreach (FieldInfo anotherNext in nextField.walk()) {
yield return anotherNext;
}
}
}
}
可能な使用法は次のとおりです。
Type t = typeof(Class1);
var allFieldsFound = from field
in t.walk()
where field.FieldType == typeof(Class5)
select field;
var firstFound = allFieldsFound.FirstOrDefault();
と の両方firstFound
のエントリallFieldsFound
は型であるため、そのプロパティFieldInfo
を介して宣言 (囲んでいる) クラスを取得できます。DeclaringType
おそらくこれは最も洗練されたソリューションではありませんが、構築するための基本的なアイデアかもしれません。