예제 #1
0
        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);
                }
            }
        }
예제 #2
0
        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);
                }
            }
        }