假设“入口点”位于层次结构的“顶部”(例如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
属性获取声明(封闭)类。
也许这不是最优雅的解决方案,但可能是一个基本的想法。