internal TypeReader GetDefaultTypeReader(Type type) { if (_defaultTypeReaders.TryGetValue(type, out var reader)) { return(reader); } var typeInfo = type.GetTypeInfo(); //Is this an enum? if (typeInfo.IsEnum) { reader = EnumTypeReader.GetReader(type); _defaultTypeReaders[type] = reader; return(reader); } //Is this an entity? for (int i = 0; i < _entityTypeReaders.Count; i++) { if (type == _entityTypeReaders[i].Item1 || typeInfo.ImplementedInterfaces.Contains(_entityTypeReaders[i].Item1)) { reader = Activator.CreateInstance(_entityTypeReaders[i].Item2.MakeGenericType(type)) as TypeReader; _defaultTypeReaders[type] = reader; return(reader); } } return(null); }
private IReadOnlyList <CommandParameter> BuildParameters(MethodInfo methodInfo) { var parameters = methodInfo.GetParameters(); if (parameters.Length == 0 || parameters[0].ParameterType != typeof(IUserMessage)) { throw new InvalidOperationException($"The first parameter of a command must be {nameof(IUserMessage)}."); } var paramBuilder = ImmutableArray.CreateBuilder <CommandParameter>(parameters.Length - 1); for (int i = 1; i < parameters.Length; i++) { var parameter = parameters[i]; var type = parameter.ParameterType; //Detect 'params' bool isMultiple = parameter.GetCustomAttribute <ParamArrayAttribute>() != null; if (isMultiple) { type = type.GetElementType(); } var reader = Module.Service.GetTypeReader(type); var typeInfo = type.GetTypeInfo(); //Detect enums if (reader == null && typeInfo.IsEnum) { reader = EnumTypeReader.GetReader(type); Module.Service.AddTypeReader(type, reader); } if (reader == null) { throw new InvalidOperationException($"{type.FullName} is not supported as a command parameter, are you missing a TypeReader?"); } bool isRemainder = parameter.GetCustomAttribute <RemainderAttribute>() != null; if (isRemainder && i != parameters.Length - 1) { throw new InvalidOperationException("Remainder parameters must be the last parameter in a command."); } string name = parameter.Name; string summary = parameter.GetCustomAttribute <SummaryAttribute>()?.Text; bool isOptional = parameter.IsOptional; object defaultValue = parameter.HasDefaultValue ? parameter.DefaultValue : null; paramBuilder.Add(new CommandParameter(parameters[i], name, summary, type, reader, isOptional, isRemainder, isMultiple, defaultValue)); } return(paramBuilder.ToImmutable()); }