diff --git a/src/Discord.Net.Commands/CommandService.cs b/src/Discord.Net.Commands/CommandService.cs index 9c2440b7c..010a0ee8a 100644 --- a/src/Discord.Net.Commands/CommandService.cs +++ b/src/Discord.Net.Commands/CommandService.cs @@ -37,24 +37,7 @@ namespace Discord.Commands _typeReaders = new ConcurrentDictionary>(); _defaultTypeReaders = new ConcurrentDictionary - { - [typeof(bool)] = new SimpleTypeReader(), - [typeof(char)] = new SimpleTypeReader(), - [typeof(string)] = new SimpleTypeReader(), - [typeof(byte)] = new SimpleTypeReader(), - [typeof(sbyte)] = new SimpleTypeReader(), - [typeof(ushort)] = new SimpleTypeReader(), - [typeof(short)] = new SimpleTypeReader(), - [typeof(uint)] = new SimpleTypeReader(), - [typeof(int)] = new SimpleTypeReader(), - [typeof(ulong)] = new SimpleTypeReader(), - [typeof(long)] = new SimpleTypeReader(), - [typeof(float)] = new SimpleTypeReader(), - [typeof(double)] = new SimpleTypeReader(), - [typeof(decimal)] = new SimpleTypeReader(), - [typeof(DateTime)] = new SimpleTypeReader(), - [typeof(DateTimeOffset)] = new SimpleTypeReader(), - + { [typeof(IMessage)] = new MessageTypeReader(), [typeof(IUserMessage)] = new MessageTypeReader(), [typeof(IChannel)] = new ChannelTypeReader(), @@ -72,6 +55,9 @@ namespace Discord.Commands [typeof(IGroupUser)] = new UserTypeReader(), [typeof(IGuildUser)] = new UserTypeReader(), }; + foreach (var type in PrimitiveParsers.SupportedTypes) + _defaultTypeReaders[type] = PrimitiveTypeReader.Create(type); + _caseSensitive = config.CaseSensitiveCommands; _defaultRunMode = config.DefaultRunMode; } diff --git a/src/Discord.Net.Commands/PrimitiveParsers.cs b/src/Discord.Net.Commands/PrimitiveParsers.cs index 0b00a90e0..623ddafa7 100644 --- a/src/Discord.Net.Commands/PrimitiveParsers.cs +++ b/src/Discord.Net.Commands/PrimitiveParsers.cs @@ -8,9 +8,11 @@ namespace Discord.Commands internal static class PrimitiveParsers { - private static readonly IReadOnlyDictionary _parsers; + private static readonly Lazy> _parsers = new Lazy>(CreateParsers); - static PrimitiveParsers() + public static IEnumerable SupportedTypes = _parsers.Value.Keys; + + static IReadOnlyDictionary CreateParsers() { var parserBuilder = ImmutableDictionary.CreateBuilder(); parserBuilder[typeof(bool)] = (TryParseDelegate)bool.TryParse; @@ -34,10 +36,10 @@ namespace Discord.Commands value = str; return true; }; - _parsers = parserBuilder.ToImmutable(); + return parserBuilder.ToImmutable(); } - public static TryParseDelegate Get() => (TryParseDelegate)_parsers[typeof(T)]; - public static Delegate Get(Type type) => _parsers[type]; + public static TryParseDelegate Get() => (TryParseDelegate)_parsers.Value[typeof(T)]; + public static Delegate Get(Type type) => _parsers.Value[type]; } } diff --git a/src/Discord.Net.Commands/Readers/SimpleTypeReader.cs b/src/Discord.Net.Commands/Readers/PrimitiveTypeReader.cs similarity index 57% rename from src/Discord.Net.Commands/Readers/SimpleTypeReader.cs rename to src/Discord.Net.Commands/Readers/PrimitiveTypeReader.cs index ad939e59d..824154cd0 100644 --- a/src/Discord.Net.Commands/Readers/SimpleTypeReader.cs +++ b/src/Discord.Net.Commands/Readers/PrimitiveTypeReader.cs @@ -1,12 +1,22 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; namespace Discord.Commands { - internal class SimpleTypeReader : TypeReader + internal static class PrimitiveTypeReader + { + public static TypeReader Create(Type type) + { + type = typeof(PrimitiveTypeReader<>).MakeGenericType(type); + return Activator.CreateInstance(type) as TypeReader; + } + } + + internal class PrimitiveTypeReader : TypeReader { private readonly TryParseDelegate _tryParse; - public SimpleTypeReader() + public PrimitiveTypeReader() { _tryParse = PrimitiveParsers.Get(); }