Cleaned up params implementation

This commit is contained in:
RogueException
2016-07-30 22:24:02 -03:00
parent 6732e256fb
commit a04cf5201a
3 changed files with 20 additions and 32 deletions

View File

@@ -71,7 +71,6 @@ namespace Discord.Commands
{
var parameter = parameters[i];
var type = parameter.ParameterType;
Type underlyingType = null;
if (i == 0)
{
@@ -81,20 +80,18 @@ namespace Discord.Commands
continue;
}
// TODO: is there a better way of detecting 'params'?
bool isParams = type.IsArray && i == parameters.Length - 1;
if (isParams)
underlyingType = type.GetElementType();
else
underlyingType = type;
//Detect 'params'
bool isMultiple = parameter.GetCustomAttribute<ParamArrayAttribute>() != null;
if (isMultiple)
type = type.GetElementType();
var reader = Module.Service.GetTypeReader(underlyingType);
var underlyingTypeInfo = underlyingType.GetTypeInfo();
var reader = Module.Service.GetTypeReader(type);
var typeInfo = type.GetTypeInfo();
if (reader == null && underlyingTypeInfo.IsEnum)
//Detect enums
if (reader == null && typeInfo.IsEnum)
{
reader = EnumTypeReader.GetReader(underlyingType);
reader = EnumTypeReader.GetReader(type);
Module.Service.AddTypeReader(type, reader);
}
@@ -110,7 +107,7 @@ namespace Discord.Commands
bool isOptional = parameter.IsOptional;
object defaultValue = parameter.HasDefaultValue ? parameter.DefaultValue : null;
paramBuilder.Add(new CommandParameter(name, description, type, underlyingType, reader, isOptional, isRemainder, isParams, defaultValue));
paramBuilder.Add(new CommandParameter(name, description, type, reader, isOptional, isRemainder, isMultiple, defaultValue));
}
return paramBuilder.ToImmutable();
}
@@ -118,8 +115,7 @@ namespace Discord.Commands
{
if (methodInfo.ReturnType != typeof(Task))
throw new InvalidOperationException("Commands must return a non-generic Task.");
//TODO: Temporary reflection hack. Lets build an actual expression tree here.
return (msg, args) =>
{
object[] newArgs = new object[args.Count + 1];