Exemple #1
0
        public override bool CanConvert(Type objectType)
        {
            if (objectType == null)
            {
                return(false);
            }

            bool isKVPObject = false;

            if (typeof(IChoKeyValueType).IsAssignableFrom(objectType))
            {
                isKVPObject = true;
            }
            else
            {
                var isKVPAttrDefined = ChoTypeDescriptor.GetTypeAttribute <ChoKeyValueTypeAttribute>(objectType) != null;
                if (isKVPAttrDefined)
                {
                    var kP = ChoTypeDescriptor.GetProperties <ChoKeyAttribute>(objectType).FirstOrDefault();
                    var vP = ChoTypeDescriptor.GetProperties <ChoValueAttribute>(objectType).FirstOrDefault();
                    if (kP != null && vP != null)
                    {
                        isKVPObject = true;
                    }
                }
            }

            return(isKVPObject);
        }
        protected override void Init(Type recordType)
        {
            base.Init(recordType);

            if (recordType == null)
            {
                return;
            }


            var pd = ChoTypeDescriptor.GetTypeAttribute <ChoJSONPathAttribute>(recordType);

            if (pd != null)
            {
                JSONPath             = pd.JSONPath;
                AllowComplexJSONPath = pd.AllowComplexJSONPath;
            }

            ChoJSONRecordObjectAttribute recObjAttr = ChoType.GetAttribute <ChoJSONRecordObjectAttribute>(recordType);

            if (recObjAttr != null)
            {
            }

            if (JSONRecordFieldConfigurations.Count == 0)
            {
                MapRecordFields(); // DiscoverRecordFields(recordType, false);
            }
        }
Exemple #3
0
        public static void Add(string name, JsonConverter converter)
        {
            ChoGuard.ArgumentNotNullOrEmpty(name, nameof(name));
            if (converter == null)
            {
                return;
            }

            lock (_padLock)
            {
                if (!_convertersCache.ContainsKey(name))
                {
                    _convertersCache.Add(name, converter);
                }
                else
                {
                    _convertersCache[name] = converter;
                }

                var dna = ChoTypeDescriptor.GetTypeAttribute <DisplayNameAttribute>(converter.GetType());
                if (dna != null && !dna.DisplayName.IsNullOrWhiteSpace())
                {
                    if (!_convertersCache.ContainsKey(dna.DisplayName))
                    {
                        _convertersCache.Add(dna.DisplayName, converter);
                    }
                    else
                    {
                        _convertersCache[dna.DisplayName] = converter;
                    }
                }
            }
        }
Exemple #4
0
        protected void LoadKnownTypes(Type recordType)
        {
            if (_knownTypeInitialized)
            {
                return;
            }

            _knownTypeInitialized = true;
            if (recordType == null)
            {
                return;
            }

            if (_knownTypes == null)
            {
                _knownTypes = new Dictionary <string, Type>(StringComparer.InvariantCultureIgnoreCase);
            }

            _knownTypes = ChoTypeDescriptor.GetTypeAttributes <ChoKnownTypeAttribute>(recordType).Where(a => a.Type != null && !a.Value.IsNullOrWhiteSpace())
                          .GroupBy(kvp => kvp.Value)
                          .ToDictionary(kvp => kvp.Key, kvp => kvp.First().Type, _knownTypes.Comparer == null ? StringComparer.InvariantCultureIgnoreCase : _knownTypes.Comparer);

            var kta = ChoTypeDescriptor.GetTypeAttribute <ChoKnownTypeDiscriminatorAttribute>(recordType);

            if (kta != null && !kta.Discriminator.IsNullOrWhiteSpace())
            {
                KnownTypeDiscriminator = kta.Discriminator.Trim();
            }
        }
Exemple #5
0
        public static void Init()
        {
            if (_isInit)
            {
                return;
            }

            lock (_padLock)
            {
                if (_isInit)
                {
                    return;
                }

                try
                {
                    //IsInitialized = true;

                    Dictionary <string, JsonConverter> dict = _convertersCache;

                    var convs = ChoType.GetAllTypes().Where(t => typeof(JsonConverter).IsAssignableFrom(t) && !t.IsGenericType && ChoType.HasDefaultConstructor(t))
                                .Distinct().ToArray();

                    foreach (var c in convs)
                    {
                        var dad = ChoTypeDescriptor.GetTypeAttribute <ChoDisableAutoDiscoverabilityAttribute>(c);
                        if (dad != null && dad.Flag)
                        {
                            continue;
                        }

                        if (dict.ContainsKey(c.Name))
                        {
                            continue;
                        }
                        try
                        {
                            dict.Add(c.Name, Activator.CreateInstance(c) as JsonConverter);

                            var dna = ChoTypeDescriptor.GetTypeAttribute <DisplayNameAttribute>(c);
                            if (dna != null && !dna.DisplayName.IsNullOrWhiteSpace())
                            {
                                if (!dict.ContainsKey(dna.DisplayName))
                                {
                                    dict.Add(dna.DisplayName, Activator.CreateInstance(c) as JsonConverter);
                                }
                            }
                        }
                        catch { }
                    }
                }
                catch
                {
                }

                _isInit = true;
            }
        }
Exemple #6
0
        protected void Init(Type baseType)
        {
            string knownTypeDiscriminator = null;
            Dictionary <string, Type> knownTypes;

            knownTypes = ChoTypeDescriptor.GetTypeAttributes <ChoKnownTypeAttribute>(baseType).Where(a => a.Type != null && !a.Value.IsNullOrWhiteSpace())
                         .GroupBy(kvp => kvp.Value)
                         .ToDictionary(kvp => kvp.Key, kvp => kvp.First().Type, StringComparer.InvariantCultureIgnoreCase);

            var kta = ChoTypeDescriptor.GetTypeAttribute <ChoKnownTypeDiscriminatorAttribute>(baseType);

            if (kta != null && !kta.Discriminator.IsNullOrWhiteSpace())
            {
                knownTypeDiscriminator = kta.Discriminator.Trim();
            }

            Init(baseType, knownTypeDiscriminator, knownTypes, null);
        }
Exemple #7
0
        public static bool IsKeyValueType(this Type type)
        {
            bool isKVPObject = false;

            if (typeof(IChoKeyValueType).IsAssignableFrom(type))
            {
                isKVPObject = true;
            }
            else
            {
                var isKVPAttrDefined = ChoTypeDescriptor.GetTypeAttribute <ChoKeyValueTypeAttribute>(type) != null;
                if (isKVPAttrDefined)
                {
                    var kP = ChoTypeDescriptor.GetProperties <ChoKeyAttribute>(type).FirstOrDefault();
                    var vP = ChoTypeDescriptor.GetProperties <ChoValueAttribute>(type).FirstOrDefault();
                    if (kP != null && vP != null)
                    {
                        isKVPObject = true;
                    }
                }
            }

            return(isKVPObject);
        }
Exemple #8
0
        public static JToken SerializeToJToken(this JsonSerializer serializer, object value, Formatting?formatting = null, JsonSerializerSettings settings = null,
                                               bool dontUseConverter = false, bool enableXmlAttributePrefix = false)
        {
            JsonConverter conv = null;

            if (!dontUseConverter)
            {
                Type vt = value != null?value.GetType() : typeof(object);

                var convName = GetTypeConverterName(vt);
                conv = serializer.Converters.Where(c => c.GetType().Name == convName || (c.GetType().IsGenericType&& c.GetType().GetGenericArguments()[0] == vt)).FirstOrDefault();
                if (conv == null && ChoJSONConvertersCache.IsInitialized)
                {
                    if (ChoJSONConvertersCache.Contains(convName))
                    {
                        conv = ChoJSONConvertersCache.Get(convName);
                    }
                    else if (ChoJSONConvertersCache.Contains(vt))
                    {
                        conv = ChoJSONConvertersCache.Get(vt);
                    }
                }
            }

            if (value != null)
            {
                if (!value.GetType().IsSimple())
                {
                    bool disableImplcityOp = false;
                    if (ChoTypeDescriptor.GetTypeAttribute <ChoTurnOffImplicitOpsAttribute>(value.GetType()) != null)
                    {
                        disableImplcityOp = ChoTypeDescriptor.GetTypeAttribute <ChoTurnOffImplicitOpsAttribute>(value.GetType()).Flag;
                    }

                    if (!disableImplcityOp)
                    {
                        Type to = null;
                        if (value.GetType().CanCastToPrimitiveType(out to))
                        {
                            value = ChoConvert.ConvertTo(value, to);
                        }
                        else if (value.GetType().GetImplicitTypeCastBackOps().Any())
                        {
                            var castTypes = value.GetType().GetImplicitTypeCastBackOps();

                            foreach (var ct in castTypes)
                            {
                                try
                                {
                                    value = ChoConvert.ConvertTo(value, ct);
                                    break;
                                }
                                catch { }
                            }
                        }
                    }
                }
            }

            JToken t = null;

            if (settings != null)
            {
                if (conv != null)
                {
                    settings.Converters.Add(conv);
                }
            }
            if (formatting == null)
            {
                formatting = serializer.Formatting;
            }

            if (settings != null && settings.Context.Context == null && enableXmlAttributePrefix)
            {
                settings.Context = new System.Runtime.Serialization.StreamingContext(System.Runtime.Serialization.StreamingContextStates.All, new ChoDynamicObject());
                dynamic ctx = settings.Context.Context;
                ctx.EnableXmlAttributePrefix = enableXmlAttributePrefix;
            }

            if (conv != null)
            {
                t = JToken.Parse(JsonConvert.SerializeObject(value, formatting.Value, conv));
            }
            else if (settings != null)
            {
                t = JToken.Parse(JsonConvert.SerializeObject(value, formatting.Value, settings));
            }
            else
            {
                t = JToken.FromObject(value, serializer);
            }
            return(t);
        }