public static VLTBaseType DoPrimitiveConversion(PrimitiveTypeBase primitiveTypeBase, string str) { var type = primitiveTypeBase.GetType(); if (_typeCache.TryGetValue(type, out var conversionType)) { return(DoPrimitiveConversion(primitiveTypeBase, str, conversionType)); } // Do primitive conversion var primitiveInfoAttribute = type.GetCustomAttribute <PrimitiveInfoAttribute>(); if (primitiveInfoAttribute == null) { // Try to determine enum type if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(VLTEnumType <>)) { primitiveInfoAttribute = new PrimitiveInfoAttribute(type.GetGenericArguments()[0]); } else { throw new InvalidDataException("Cannot determine primitive type"); } } var primitiveType = primitiveInfoAttribute.PrimitiveType; _typeCache[type] = primitiveType; return(DoPrimitiveConversion(primitiveTypeBase, str, primitiveType)); }
private static VLTBaseType DoPrimitiveConversion(PrimitiveTypeBase primitiveTypeBase, string str, Type conversionType) { if (conversionType.IsEnum) { if (str.StartsWith("0x") && uint.TryParse(str.Substring(2), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out uint val)) { primitiveTypeBase.SetValue((IConvertible)Enum.Parse(conversionType, val.ToString())); } else { primitiveTypeBase.SetValue((IConvertible)Enum.Parse(conversionType, str)); } } else { if (str.StartsWith("0x") && uint.TryParse(str.Substring(2), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out uint val)) { primitiveTypeBase.SetValue((IConvertible)Convert.ChangeType(val, conversionType)); } else { primitiveTypeBase.SetValue( (IConvertible)Convert.ChangeType(str, conversionType, CultureInfo.InvariantCulture)); } } return(primitiveTypeBase); }
private object BaseTypeToData(VLTBaseType baseType) { // if we have a primitive or string value, return that // if we have an array, return a list where each item in the array has been converted (recursion FTW) // otherwise, just return the original data return(baseType switch { PrimitiveTypeBase ptb => ptb.GetValue(), IStringValue sv => sv.GetString(), VLTArrayType array => array.Items.Select(BaseTypeToData).ToList(), _ => baseType });
private static VLTBaseType DoPrimitiveConversion(PrimitiveTypeBase primitiveTypeBase, string str, Type conversionType) { if (conversionType.IsEnum) { if (str.StartsWith("0x") && uint.TryParse(str.Substring(2), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out uint val)) { primitiveTypeBase.SetValue((IConvertible)Enum.Parse(conversionType, val.ToString())); } else { primitiveTypeBase.SetValue((IConvertible)Enum.Parse(conversionType, str)); } } else { if (str.StartsWith("0x") && uint.TryParse(str.Substring(2), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out uint val)) { primitiveTypeBase.SetValue((IConvertible)Convert.ChangeType(val, conversionType)); } else { try { primitiveTypeBase.SetValue( (IConvertible)Convert.ChangeType(str, conversionType, CultureInfo.InvariantCulture)); } catch (Exception e) { throw new SerializedDatabaseLoaderException($"Failed to parse value [{str}] as type {conversionType}", e); } } } return(primitiveTypeBase); }