| @@ -1,4 +1,4 @@ | |||||
| using System; | |||||
| using System; | |||||
| using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||
| using System.Collections.Immutable; | using System.Collections.Immutable; | ||||
| @@ -262,7 +262,7 @@ namespace Discord.Commands | |||||
| /// <param name="replaceDefault">If <paramref name="reader"/> should replace the default <see cref="TypeReader"/> for <paramref name="type"/> if one exists.</param> | /// <param name="replaceDefault">If <paramref name="reader"/> should replace the default <see cref="TypeReader"/> for <paramref name="type"/> if one exists.</param> | ||||
| public void AddTypeReader(Type type, TypeReader reader, bool replaceDefault) | public void AddTypeReader(Type type, TypeReader reader, bool replaceDefault) | ||||
| { | { | ||||
| if (replaceDefault && _defaultTypeReaders.ContainsKey(type)) | |||||
| if (replaceDefault && HasDefaultTypeReader(type)) | |||||
| { | { | ||||
| _defaultTypeReaders.AddOrUpdate(type, reader, (k, v) => reader); | _defaultTypeReaders.AddOrUpdate(type, reader, (k, v) => reader); | ||||
| if (type.GetTypeInfo().IsValueType) | if (type.GetTypeInfo().IsValueType) | ||||
| @@ -281,6 +281,16 @@ namespace Discord.Commands | |||||
| AddNullableTypeReader(type, reader); | AddNullableTypeReader(type, reader); | ||||
| } | } | ||||
| } | } | ||||
| internal bool HasDefaultTypeReader(Type type) | |||||
| { | |||||
| if (_defaultTypeReaders.ContainsKey(type)) | |||||
| return true; | |||||
| var typeInfo = type.GetTypeInfo(); | |||||
| if (typeInfo.IsEnum) | |||||
| return true; | |||||
| return _entityTypeReaders.Any(x => type == x.Item1 || typeInfo.ImplementedInterfaces.Contains(x.Item2)); | |||||
| } | |||||
| internal void AddNullableTypeReader(Type valueType, TypeReader valueTypeReader) | internal void AddNullableTypeReader(Type valueType, TypeReader valueTypeReader) | ||||
| { | { | ||||
| var readers = _typeReaders.GetOrAdd(typeof(Nullable<>).MakeGenericType(valueType), x => new ConcurrentDictionary<Type, TypeReader>()); | var readers = _typeReaders.GetOrAdd(typeof(Nullable<>).MakeGenericType(valueType), x => new ConcurrentDictionary<Type, TypeReader>()); | ||||