Пример #1
0
        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);
        }
Пример #2
0
        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());
        }