コード例 #1
0
        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));
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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
            });
コード例 #4
0
        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);
        }