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(); } }
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); }
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); } }