From 875525b6be3d54b08763d3d35f6f67bd2acaf7aa Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sun, 9 Dec 2018 17:49:54 +0100 Subject: [PATCH] Handle unnamed functions better --- .../ScriptMethodInfoFunction.cs | 13 +++++++++-- Upsilon/BaseTypes/UserData/UserDataMethod.cs | 23 +++++++++++++------ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/Upsilon/BaseTypes/ScriptFunction/ScriptMethodInfoFunction.cs b/Upsilon/BaseTypes/ScriptFunction/ScriptMethodInfoFunction.cs index 4147ce0..bb6f58a 100644 --- a/Upsilon/BaseTypes/ScriptFunction/ScriptMethodInfoFunction.cs +++ b/Upsilon/BaseTypes/ScriptFunction/ScriptMethodInfoFunction.cs @@ -53,8 +53,17 @@ namespace Upsilon.BaseTypes.ScriptFunction object result; try { - result = _object.GetType().InvokeMember(_method.Name, BindingFlags.InvokeMethod, UpsilonBinder.Default, - _object, objects.ToArray()); + if (_object == null) + { + var array = objects.ToArray(); + var methodInfo = _method.GetMethod(ref array); + result = methodInfo.Invoke(null, array); + } + else + { + result = _object.GetType().InvokeMember(_method.Name, BindingFlags.InvokeMethod, UpsilonBinder.Default, + _object, objects.ToArray()); + } } catch (TargetInvocationException e) { diff --git a/Upsilon/BaseTypes/UserData/UserDataMethod.cs b/Upsilon/BaseTypes/UserData/UserDataMethod.cs index 11649e7..6e229d0 100644 --- a/Upsilon/BaseTypes/UserData/UserDataMethod.cs +++ b/Upsilon/BaseTypes/UserData/UserDataMethod.cs @@ -73,28 +73,37 @@ namespace Upsilon.BaseTypes.UserData return MethodParts; } - public MethodInfo GetMethod(System.Type[] parameterTypes) + public MethodInfo GetMethod(ref object[] parameters) { foreach (var userDataMethodPart in MethodParts) { - if (userDataMethodPart.Parameters.Length < parameterTypes.Length) + if (userDataMethodPart.Parameters.Length < parameters.Length) continue; bool valid = true; for (var index = 0; index < userDataMethodPart.Parameters.Length; index++) { var userDataMethodParameter = userDataMethodPart.Parameters[index]; - if (index >= parameterTypes.Length) + if (index >= parameters.Length) { if (userDataMethodParameter.IsOptional) return userDataMethodPart.Method; valid = false; break; } - var parameter = parameterTypes[index]; - if (parameter.IsGenericType) parameter = parameter.GetGenericTypeDefinition(); - if (userDataMethodParameter.Type != parameter && - !userDataMethodParameter.Type.IsAssignableFrom(parameter)) + var parameter = parameters[index]; + var parameterType = parameter.GetType(); + if (parameterType.IsGenericType) parameter = parameterType.GetGenericTypeDefinition(); + if (userDataMethodParameter.Type != parameterType && + !userDataMethodParameter.Type.IsAssignableFrom(parameterType)) { + if (parameter is ScriptType t) + { + if (userDataMethodParameter.Type.IsAssignableFrom(t.GetCSharpType())) + { + parameters[index] = ((ScriptType) parameter).ToCSharpObject(); + continue; + } + } valid = false; break; }