public void UnregisterXmlType(Type type, String name, String namespaceString) { ParamChecker.AssertParamNotNull(type, "type"); ParamChecker.AssertParamNotNull(name, "name"); if (namespaceString == null) { namespaceString = String.Empty; } XmlTypeKey xmlTypeKey = new XmlTypeKey(); xmlTypeKey.Name = name; xmlTypeKey.Namespace = namespaceString; writeLock.Lock(); try { xmlTypeToClassMap.Remove(xmlTypeKey.Name, xmlTypeKey.Namespace); IList <XmlTypeKey> xmlTypeKeys = classToXmlTypeMap[type]; xmlTypeKeys.Remove(xmlTypeKey); if (xmlTypeKeys.Count == 0) { classToXmlTypeMap.Remove(type); } } finally { writeLock.Unlock(); } }
public Type GetType(String name, String namespaceString) { ParamChecker.AssertParamNotNull(name, "name"); if (namespaceString == null) { namespaceString = String.Empty; } XmlTypeKey xmlTypeKey = new XmlTypeKey(); xmlTypeKey.Name = name; xmlTypeKey.Namespace = namespaceString; readLock.Lock(); try { Type type = xmlTypeToClassMap.Get(name, namespaceString); if (type == null) { if (Log.DebugEnabled) { LoggerHistory.DebugOnce(Log, this, "XmlTypeNotFound: name=" + name + ", namespace=" + namespaceString); } return(null); } return(type); } finally { readLock.Unlock(); } }
public void RegisterXmlType(Type type, String name, String namespaceString) { ParamChecker.AssertParamNotNull(type, "type"); ParamChecker.AssertParamNotNull(name, "name"); if (namespaceString == null) { namespaceString = String.Empty; } XmlTypeKey xmlTypeKey = new XmlTypeKey(); xmlTypeKey.Name = name; xmlTypeKey.Namespace = namespaceString; writeLock.Lock(); try { Type typeToSet = type; Type existingType = xmlTypeToClassMap.Get(name, namespaceString); if (existingType != null) { if (type.IsAssignableFrom(existingType)) { // Nothing else to to } else if (existingType.IsAssignableFrom(type)) { typeToSet = existingType; } else if (typeof(IList <>).Equals(existingType) && typeof(ObservableCollection <>).Equals(type)) { // Workaround for C# since the two collections are not assignable to eachother. typeToSet = existingType; } else { throw new Exception("Error while registering '" + type.FullName + "': Unassignable type '" + existingType.FullName + "' already registered for: Name='" + name + "' Namespace='" + namespaceString + "'"); } } xmlTypeToClassMap.Put(name, namespaceString, typeToSet); IList <XmlTypeKey> xmlTypeKeys = DictionaryExtension.ValueOrDefault(classToXmlTypeMap, type); if (xmlTypeKeys == null) { xmlTypeKeys = new List <XmlTypeKey>(); classToXmlTypeMap.Add(type, xmlTypeKeys); } xmlTypeKeys.Add(xmlTypeKey); } finally { writeLock.Unlock(); } }