Esempio n. 1
0
        private Expression[] CreateParameterExpressions(MethodInfo method, Expression argumentsParameter)
        {
            Expression[] list = new Expression[method.GetParameters().Length];
            int          i    = 0;

            foreach (ParameterInfo info in method.GetParameters())
            {
                list[i] = ConvertExpression.ConvertFromScript(argumentsParameter, info.ParameterType, i);
                i++;
            }
            return(list);
        }
Esempio n. 2
0
        /// <summary>
        /// Создается сеттер.
        /// </summary>
        /// <param name="property_info"></param>
        /// <returns></returns>
        private Action <T, IValue> CreateSetter(PropertyInfo property_info)
        {
            ParameterExpression instance_parameter = Expression.Parameter(typeof(T), "target");
            ParameterExpression argument_parameter = Expression.Parameter(typeof(IValue), "argument");

            var        setter = property_info.GetSetMethod();
            Expression call;

            // Если свойство только для чтения, то вызов функции выдаст ошибку.
            if (setter == null)
            {
                call = Expression.Throw(Expression.Constant(new Exception($"Поле [{property_info.Name}] объекта недоступно для записи")));
            }
            else
            {
                call = Expression.Call(instance_parameter, setter, ConvertExpression.ConvertFromScript(argument_parameter, property_info.PropertyType, 0));
            }

            return(Expression.Lambda <Action <T, IValue> >(call, instance_parameter, argument_parameter).Compile());
        }