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