Ejemplo n.º 1
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();
            }
        }
Ejemplo n.º 2
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);
        }
Ejemplo n.º 3
0
        private void RegisterYamlTagMapForType(Type recordType)
        {
            if (_refDict.Contains(recordType))
            {
                return;
            }
            else
            {
                _refDict.Add(recordType);
            }

            if (recordType.IsDynamicType() || recordType.IsSpecialCollectionType())
            {
                return;
            }

            var tagMapAttrs = ChoTypeDescriptor.GetTypeAttributes <ChoYamlTagMapAttribute>(recordType).ToArray();

            if (tagMapAttrs.Length > 0)
            {
                foreach (var tagMapAttr in tagMapAttrs)
                {
                    if (tagMapAttr != null && !tagMapAttr.TagMap.IsNullOrWhiteSpace())
                    {
                        WithTagMapping(tagMapAttr.TagMap, recordType, tagMapAttr.Alias);
                    }
                }
            }
            else
            {
                WithTagMapping("!", recordType, false);
            }

            foreach (PropertyDescriptor pd in ChoTypeDescriptor.GetProperties(recordType))
            {
                if (pd.PropertyType.IsSimple())
                {
                    continue;
                }

                RegisterYamlTagMapForType(pd.PropertyType);
            }
        }