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
{
}

Class4 のプロパティである Class5 のインスタンスを取得できるまで、階層を反復処理する方法を推奨できる人はいますか? 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 に答える