Improve array conversion for paramslist
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
using System.Collections.Immutable;
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Immutable;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
|
||||
namespace Discord.Commands
|
||||
{
|
||||
@@ -14,6 +16,9 @@ namespace Discord.Commands
|
||||
Parameter,
|
||||
QuotedParameter
|
||||
}
|
||||
|
||||
private static readonly MethodInfo _convertArrayMethod = typeof(CommandParser).GetTypeInfo().GetDeclaredMethod(nameof(ConvertParamsList));
|
||||
private static readonly ConcurrentDictionary<Type, Func<List<object>, object>> _arrayConverters = new ConcurrentDictionary<Type, Func<List<object>, object>>();
|
||||
|
||||
public static async Task<ParseResult> ParseArgs(Command command, IMessage context, string input, int startPos)
|
||||
{
|
||||
@@ -122,11 +127,12 @@ namespace Discord.Commands
|
||||
|
||||
if (curPos == endPos)
|
||||
{
|
||||
Array realParams = Array.CreateInstance(curParam.ElementType, paramsList.Count);
|
||||
for (int i = 0; i < paramsList.Count; i++)
|
||||
realParams.SetValue(Convert.ChangeType(paramsList[i], curParam.ElementType), i);
|
||||
|
||||
argList.Add(realParams);
|
||||
var func = _arrayConverters.GetOrAdd(curParam.ElementType, t =>
|
||||
{
|
||||
var method = _convertArrayMethod.MakeGenericMethod(t);
|
||||
return (Func<List<object>, object>)method.CreateDelegate(typeof(Func<List<object>, object>));
|
||||
});
|
||||
argList.Add(func.Invoke(paramsList));
|
||||
|
||||
curParam = null;
|
||||
curPart = ParserPart.None;
|
||||
@@ -169,5 +175,13 @@ namespace Discord.Commands
|
||||
|
||||
return ParseResult.FromSuccess(argList.ToImmutable());
|
||||
}
|
||||
|
||||
private static T[] ConvertParamsList<T>(List<object> paramsList)
|
||||
{
|
||||
var array = new T[paramsList.Count];
|
||||
for (int i = 0; i < array.Length; i++)
|
||||
array[i] = (T)paramsList[i];
|
||||
return array;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user