0

我有一个如下所示的对象模型。

public class Class1
{
    public Class2 @Class2;
}

public class Class2
{
    public Class3 @Class3;
    public Class4 @Class4;
}

public class Class3
{
    public Class5 @Class5;
}

public class Class4
{
    public Class5 @Class5;
}

public class Class5
{
    public Class6 @Class6;
}

public class Class6
{
}

谁能推荐一种迭代层次结构的方法,直到我可以获得 Class5 的实例,它是 Class4 的属性?在 VS2012、C# 上使用 .NET 4.5。

4

2 回答 2

1

执行此操作的典型方法是使用访问者模式。在您的情况下,您的 Visit 方法将使用反射来“破解”传入的类型。

这里有一个很好的例子来说明如何构造一个表达式树访问者,它正在做与你想要的类似的事情(层次结构爬行)。

于 2013-03-27T21:09:56.733 回答
1

假设“入口点”位于层次结构的“顶部”(例如Class1Class2),我可以想到一些扩展方法,这些方法类似于建议的访问者模式。

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属性获取声明(封闭)类。

也许这不是最优雅的解决方案,但可能是一个基本的想法。

于 2013-03-27T22:20:37.583 回答