protected async Task <object> CallLocalMethod(string instanceAqn, string method, List <object> parameters, string playerHandle = null)
        {
            if (!RemotesByAqn.TryGetValue(instanceAqn, out var remoteInfo))
            {
                LogHelper.Log($"Could not resolve remote with assembly qualified name {instanceAqn}");
                return(null);
            }

            if (!remoteInfo.MethodsByName.TryGetValue(method, out var targetMethod))
            {
                LogHelper.Log($"Could not resolve target method {instanceAqn}.{method}");
                return(null);
            }

            var invokeParameters = TypeResolveHelper.ResolveMethodParameterTypes(parameters, targetMethod, playerHandle);

            if (invokeParameters == null)
            {
                return(null);
            }

            var result = targetMethod.Invoke(remoteInfo.Instance, invokeParameters);

            if (result == null)
            {
                return(null);
            }

            // Synchronous method
            if (!TaskType.IsAssignableFrom(targetMethod.ReturnType))
            {
                return(result);
            }

            // Task with return type
            if (targetMethod.ReturnType.IsGenericType)
            {
                return(await(dynamic) result);
            }

            // Task with no return type
            await(dynamic) result;
            return(null);
        }