private void SetFieldByNestedField(string hierarchy, object target) { Console.WriteLine("Called SetFieldByNestedField, hierarchy=" + hierarchy + ", target.GetType().Name=" + target.GetType().Name); NestName names = new NestName(hierarchy); if (names.IsNextNames() == false) { // 上位層なしのフィールド名の場合 SetFieldOrThrow(names.FirstName, target); } else { if (names.IsFreeParent()) { // 任意のひとつの階層が指定された場合 SetFieldByFreeParent(names.NextNames, target); } else if (names.IsFreeHierarchy()) { // 任意の複数の上位階層が指定された場合 string tmpNames = names.NextNames; for (int i = 0; i < NEST_MAX; i++) { // 一時的な名前でSetFieldByNestedField()を呼び出してみる。 // フィールドが見つからない場合、ひとつ階層を掘り下げた名前にしてみる。 if (TryFieldByNestedField(tmpNames, target)) { return; } else { tmpNames = "*." + tmpNames; } } throw new ApplicationException("フィールドが見つかりませんでした。hierarchy=" + hierarchy); } else { // 特定の階層が指定された場合 object obj = GetObjectOrThrow(names.FirstName, target); SetFieldByNestedField(names.NextNames, obj); } } }
private object GetObjectByNestedField(string hierarchy, object target) { Console.WriteLine("Called GetObjectByNestedField, hierarchy=" + hierarchy + ", target.GetType().Name=" + target.GetType().Name); if (mNest >= NEST_MAX) { return null; } mNest++; NestName names = new NestName(hierarchy); if (names.IsNextNames() == false) { return GetObjectOrThrow(names.FirstName, target); } else { if (names.IsFreeParent()) { return GetNextObjectByFreeParent(names.NextNames, target); } else if (names.IsFreeHierarchy()) { return GetNextObjectByFreeHierarchy(names.NextNames, target); } else { object obj = GetObjectOrThrow(names.FirstName, target); return GetObjectByNestedField(names.NextNames, obj); } } }