private static bool GetField()

in src/PSDocs/Common/ObjectHelper.cs [174:235]


        private static bool GetField(object targetObject, NameToken token, bool caseSensitive, out object value)
        {
            value = null;
            var baseObject = GetBaseObject(targetObject);
            if (baseObject == null)
                return false;

            var baseType = baseObject.GetType();
            object field = null;
            bool foundField = false;

            // Handle this object
            if (token.Type == NameTokenType.Self)
            {
                field = baseObject;
                foundField = true;
            }
            // Handle dictionaries and hashtables
            else if (token.Type == NameTokenType.Field && baseObject is IDictionary dictionary)
            {
                if (TryDictionary(dictionary, token.Name, caseSensitive, out field))
                    foundField = true;
            }
            // Handle PSObjects
            else if (token.Type == NameTokenType.Field && targetObject is PSObject psObject)
            {
                if (TryPropertyValue(psObject, token.Name, caseSensitive, out field))
                    foundField = true;
            }
            // Handle DynamicObjects
            else if (token.Type == NameTokenType.Field && targetObject is DynamicObject dynamicObject)
            {
                if (TryPropertyValue(dynamicObject, token.Name, caseSensitive, out field))
                    foundField = true;
            }
            // Handle all other CLR types
            else if (token.Type == NameTokenType.Field)
            {
                if (TryPropertyValue(targetObject, token.Name, baseType, caseSensitive, out field) || TryFieldValue(targetObject, token.Name, baseType, caseSensitive, out field))
                    foundField = true;
            }
            // Handle Index tokens
            else if (baseType.IsArray && baseObject is Array array && token.Index < array.Length)
            {
                field = array.GetValue(token.Index);
                foundField = true;
            }

            if (foundField)
            {
                if (token.Next == null)
                {
                    value = field;
                    return true;
                }
                else
                {
                    return GetField(targetObject: field, token: token.Next, caseSensitive: caseSensitive, value: out value);
                }
            }
            return false;
        }