public Field this[
            string key
        ]
        {
            get
            {
                /*
                 * TODO: It is possible for different field dictionaries to have the SAME fully qualified field
                 * name if they are descendants of a common ancestor with that name and have no
                 * partial field names (T entries) of their own. Such field dictionaries are different
                 * representations of the same underlying field; they should differ only in properties
                 * that specify their visual appearance. In particular, field dictionaries with the same
                 * fully qualified field name must have the same field type (FT), value (V), and default
                 * value (DV).
                 */
                PdfReference valueFieldReference = null;
                {
                    IEnumerator partialNamesIterator = key.Split('.').GetEnumerator();
                    IEnumerator <PdfDirectObject> fieldObjectsIterator = BaseDataObject.GetEnumerator();
                    while (partialNamesIterator.MoveNext())
                    {
                        string partialName = (string)partialNamesIterator.Current;
                        valueFieldReference = null;
                        while (fieldObjectsIterator != null &&
                               fieldObjectsIterator.MoveNext())
                        {
                            PdfReference  fieldReference  = (PdfReference)fieldObjectsIterator.Current;
                            PdfDictionary fieldDictionary = (PdfDictionary)fieldReference.DataObject;
                            PdfTextString fieldName       = (PdfTextString)fieldDictionary[PdfName.T];
                            if (fieldName != null && fieldName.Value.Equals(partialName))
                            {
                                valueFieldReference = fieldReference;
                                PdfArray kidFieldObjects = (PdfArray)fieldDictionary.Resolve(PdfName.Kids);
                                fieldObjectsIterator = (kidFieldObjects == null ? null : kidFieldObjects.GetEnumerator());
                                break;
                            }
                        }
                        if (valueFieldReference == null)
                        {
                            break;
                        }
                    }
                }
                return(Field.Wrap(valueFieldReference));
            }
            set
            {
                throw new NotImplementedException();

                /*
                 * TODO:put the field into the correct position, based on the full name (key)!!!
                 */
            }
        }