/// <summary>
        /// Converts arguments from one type to another type that is required by the method call.
        /// </summary>
        /// <param name="args"></param>
        /// <param name="method">The method for which the parameters need to be converted</param>
        public static object[] ConvertArgs(List <object> args, MethodInfo method)
        {
            var hostLangArgs = new List <object>();
            var parameters   = method.GetParameters();

            if (parameters.Length == 0)
            {
                return(hostLangArgs.ToArray());
            }

            // REQUIREMENT: Number of values must match # of parameters in method.
            for (int ndx = 0; ndx < parameters.Length; ndx++)
            {
                var param     = parameters[ndx];
                var sourceArg = args[ndx] as LObject;

                // CASE 1: Null
                if (sourceArg == LObjects.Null)
                {
                    var defaultVal = LangTypeHelper.GetDefaultValue(param.ParameterType);
                    hostLangArgs.Add(defaultVal);
                }

                // CASE 2: int, bool, date, time
                else if (sourceArg.Type.IsBuiltInType())
                {
                    var convertedVal = sourceArg.GetValue();
                    convertedVal = ConvertToCorrectHostLangValue(param.ParameterType, convertedVal);
                    hostLangArgs.Add(convertedVal);
                }
                // CASE 3: LArrayType
                else if (sourceArg.Type == LTypes.Array && param.ParameterType.IsGenericType)
                {
                    var gentype = param.ParameterType.GetGenericTypeDefinition();
                    if (gentype == typeof(List <>) || gentype == typeof(IList <>))
                    {
                        args[ndx] = ConvertToTypedList((List <object>)sourceArg.GetValue(), param.ParameterType);
                    }
                }
            }
            return(hostLangArgs.ToArray());
        }
Beispiel #2
0
        /// <summary>
        /// Converts arguments from one type to another type that is required by the method call.
        /// </summary>
        /// <param name="args"></param>
        /// <param name="method">The method for which the parameters need to be converted</param>
        public static object[] ConvertArgs(List <object> args, MethodInfo method)
        {
            var hostLangArgs = new List <object>();
            var parameters   = method.GetParameters();

            if (parameters.Length == 0)
            {
                return(hostLangArgs.ToArray());
            }

            // REQUIREMENT: Number of values must match # of parameters in method.
            for (var ndx = 0; ndx < parameters.Length; ndx++)
            {
                var param     = parameters[ndx];
                var sourceArg = args[ndx] as LObject;

                // CASE 1: Null
                if (sourceArg == LObjects.Null)
                {
                    var defaultVal = LangTypeHelper.GetDefaultValue(param.ParameterType);
                    hostLangArgs.Add(defaultVal);
                }

                // CASE 2: int, bool, date, time
                else if (sourceArg.Type.IsPrimitiveType())
                {
                    var convertedVal = sourceArg.GetValue();
                    convertedVal = ConvertToCorrectHostLangValue(param.ParameterType, convertedVal);
                    hostLangArgs.Add(convertedVal);
                }
                // CASE 3: LArrayType and generic types.
                else if (sourceArg.Type == LTypes.Array)
                {
                    // Case 1: Array
                    if (param.ParameterType.IsArray)
                    {
                        if (param.ParameterType == typeof(string[]))
                        {
                            var convertedVal = ConvertToHostLangArray(param.ParameterType, (LArray)sourceArg);
                            hostLangArgs.Add(convertedVal);
                        }
                    }
                    else if (param.ParameterType.IsGenericType)
                    {
                        var gentype = param.ParameterType.GetGenericTypeDefinition();

                        // Case 2: Matching types IList<object>
                        if (gentype == typeof(IList <object>))
                        {
                            var convertedVal = sourceArg.GetValue();
                            hostLangArgs.Add(convertedVal);
                        }
                        // Case 3: Non-matching types List<object> to IList<Person>
                        else if (gentype == typeof(List <>) || gentype == typeof(IList <>))
                        {
                            //args[ndx] = ConvertToTypedList((List<object>) sourceArg.GetValue(), param.ParameterType);
                            var convertedArr = ConvertToTypedList((List <object>)sourceArg.GetValue(), param.ParameterType);
                            hostLangArgs.Add(convertedArr);
                        }
                    }
                }
            }
            return(hostLangArgs.ToArray());
        }