|
@@ -1,4 +1,4 @@
|
|
-using System;
|
|
|
|
|
|
+using System;
|
|
using System.Globalization;
|
|
using System.Globalization;
|
|
using System.Linq.Expressions;
|
|
using System.Linq.Expressions;
|
|
using System.Reflection;
|
|
using System.Reflection;
|
|
@@ -27,6 +27,12 @@ namespace Jint.Runtime.Interop
|
|
_fallbackClrFunctionInstance = fallbackClrFunctionInstance;
|
|
_fallbackClrFunctionInstance = fallbackClrFunctionInstance;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private static bool IsAssignableToGenericType(Type givenType, Type genericType)
|
|
|
|
+ {
|
|
|
|
+ var result = TypeConverter.IsAssignableToGenericType(givenType, genericType);
|
|
|
|
+ return (result >= 0);
|
|
|
|
+ }
|
|
|
|
+
|
|
public override JsValue Call(JsValue thisObject, JsValue[] jsArguments)
|
|
public override JsValue Call(JsValue thisObject, JsValue[] jsArguments)
|
|
{
|
|
{
|
|
JsValue[] ArgumentProvider(MethodDescriptor method)
|
|
JsValue[] ArgumentProvider(MethodDescriptor method)
|
|
@@ -40,6 +46,7 @@ namespace Jint.Runtime.Interop
|
|
? ProcessParamsArrays(jsArgumentsTemp, method)
|
|
? ProcessParamsArrays(jsArgumentsTemp, method)
|
|
: jsArgumentsTemp;
|
|
: jsArgumentsTemp;
|
|
}
|
|
}
|
|
|
|
+
|
|
return method.HasParams
|
|
return method.HasParams
|
|
? ProcessParamsArrays(jsArguments, method)
|
|
? ProcessParamsArrays(jsArguments, method)
|
|
: jsArguments;
|
|
: jsArguments;
|
|
@@ -56,7 +63,14 @@ namespace Jint.Runtime.Interop
|
|
{
|
|
{
|
|
parameters = new object[methodParameters.Length];
|
|
parameters = new object[methodParameters.Length];
|
|
}
|
|
}
|
|
|
|
+
|
|
var argumentsMatch = true;
|
|
var argumentsMatch = true;
|
|
|
|
+ Type[] genericArgTypes = null;
|
|
|
|
+ if (method.Method.IsGenericMethod)
|
|
|
|
+ {
|
|
|
|
+ var methodGenericArgs = method.Method.GetGenericArguments();
|
|
|
|
+ genericArgTypes = new Type[methodGenericArgs.Length];
|
|
|
|
+ }
|
|
|
|
|
|
for (var i = 0; i < parameters.Length; i++)
|
|
for (var i = 0; i < parameters.Length; i++)
|
|
{
|
|
{
|
|
@@ -68,6 +82,16 @@ namespace Jint.Runtime.Interop
|
|
{
|
|
{
|
|
parameters[i] = argument;
|
|
parameters[i] = argument;
|
|
}
|
|
}
|
|
|
|
+ else if ((parameterType.IsGenericParameter) && (IsAssignableToGenericType(argument.ToObject()?.GetType(), parameterType)))
|
|
|
|
+ {
|
|
|
|
+ var argObj = argument.ToObject();
|
|
|
|
+ if (parameterType.GenericParameterPosition >= 0)
|
|
|
|
+ {
|
|
|
|
+ genericArgTypes[parameterType.GenericParameterPosition] = argObj.GetType();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ parameters[i] = argObj;
|
|
|
|
+ }
|
|
else if (argument is null)
|
|
else if (argument is null)
|
|
{
|
|
{
|
|
// optional
|
|
// optional
|
|
@@ -84,6 +108,7 @@ namespace Jint.Runtime.Interop
|
|
{
|
|
{
|
|
result[k] = arrayInstance.TryGetValue(k, out var value) ? value : Undefined;
|
|
result[k] = arrayInstance.TryGetValue(k, out var value) ? value : Undefined;
|
|
}
|
|
}
|
|
|
|
+
|
|
parameters[i] = result;
|
|
parameters[i] = result;
|
|
}
|
|
}
|
|
else
|
|
else
|
|
@@ -110,7 +135,18 @@ namespace Jint.Runtime.Interop
|
|
// todo: cache method info
|
|
// todo: cache method info
|
|
try
|
|
try
|
|
{
|
|
{
|
|
- return FromObject(Engine, method.Method.Invoke(thisObject.ToObject(), parameters));
|
|
|
|
|
|
+ if ((method.Method.IsGenericMethodDefinition) && (method.Method is MethodInfo methodInfo))
|
|
|
|
+ {
|
|
|
|
+ var declaringType = methodInfo.DeclaringType;
|
|
|
|
+ var genericMethodInfo = methodInfo.MakeGenericMethod(genericArgTypes);
|
|
|
|
+ var thisObj = thisObject.ToObject();
|
|
|
|
+ var result = genericMethodInfo.Invoke(thisObj, parameters);
|
|
|
|
+ return FromObject(Engine, result);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ return FromObject(Engine, method.Method.Invoke(thisObject.ToObject(), parameters));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
catch (TargetInvocationException exception)
|
|
catch (TargetInvocationException exception)
|
|
{
|
|
{
|