internal bool TryParse()

in src/Elastic.Transport/Responses/Dynamic/DynamicValue.cs [540:641]


	internal bool TryParse(object defaultValue, Type targetReturnType, object value, out object newObject)
	{
		newObject = defaultValue;
		if (value == null) return false;

		if (targetReturnType.IsGenericType && targetReturnType.GetGenericTypeDefinition() == typeof(Nullable<>))
			targetReturnType = targetReturnType.GenericTypeArguments[0];

		try
		{
			if (value is JsonElement e)
			{

				// ReSharper disable once HeapView.BoxingAllocation
				newObject = ConsumeJsonElement(targetReturnType, e);
				return true;
			}

			var valueType = value.GetType();
			if (targetReturnType.IsArray && value is DynamicValue v)
			{
				value = v.Value;
				valueType = value.GetType();
			}
			if (targetReturnType.IsArray)
			{
				if (!valueType.IsArray)
				{
					return false;
				}
				var ar = (object[])value;
				var t = targetReturnType.GetElementType();
				var objectArray = ar
					.Select(a => TryParse(defaultValue, t, a, out var o) ? o : null)
					.Where(a => a != null)
					.ToArray();

				var arr = Array.CreateInstance(t, objectArray.Length);
				Array.Copy(objectArray, arr, objectArray.Length);
				newObject = arr;
				return true;
			}

			if (valueType.IsAssignableFrom(targetReturnType))
			{
				newObject = value;
				return true;
			}

			var stringValue = value as string;

			if (targetReturnType == typeof(DateTime)
				&& DateTime.TryParse(stringValue, CultureInfo.InvariantCulture, DateTimeStyles.None, out var result))
			{
				newObject = result;
				return true;
			}
			if (stringValue != null)
			{
				if (targetReturnType == typeof(object))
				{
					newObject = Convert.ChangeType(value, targetReturnType);
					return true;
				}

				var converter = TypeDescriptor.GetConverter(targetReturnType);
				if (converter.IsValid(stringValue))
				{
					newObject = converter.ConvertFromInvariantString(stringValue);
					return true;
				}
			}
			else if (value is DynamicValue dv)
				return dv.TryParse(defaultValue, targetReturnType, dv.Value, out newObject);
			else if (targetReturnType == typeof(string))
			{
				newObject = Convert.ChangeType(value, TypeCode.String, CultureInfo.InvariantCulture);
				return true;
			}
			else if (valueType.IsValueType)
			{
				newObject = Convert.ChangeType(_value, targetReturnType);
				return true;
			}
			else if (targetReturnType == typeof(DynamicDictionary) && valueType == typeof(Dictionary<string, object>))
			{
				newObject = DynamicDictionary.Create(value as Dictionary<string, object>);
				return true;
			}

			else if (targetReturnType == typeof(object))
			{
				newObject = value;
				return true;
			}
		}
		catch
		{
			return false;
		}
		return false;
	}