private static MethodFactory.ExpressionArgsPair GetObjectCreatorExpressions(ConstructorInfo constructor) { ParameterExpression args = Expression.Parameter(typeof(object[]), "args"); Expression[] callArgsExpressions = MethodFactory.GetMethodCallArgsExpressions(constructor.GetParameters(), args); NewExpression newExpression = Expression.New(constructor, callArgsExpressions); return(new MethodFactory.ExpressionArgsPair() { Expression = (Expression)newExpression, Parameters = new ParameterExpression[1] { args } }); }
private static MethodFactory.ExpressionArgsPair GetMethodCallExpressions(MethodInfo method) { ParameterExpression parameterExpression = Expression.Parameter(typeof(object), "instance"); UnaryExpression unaryExpression = Expression.Convert((Expression)parameterExpression, method.DeclaringType); ParameterExpression args = Expression.Parameter(typeof(object[]), "args"); Expression[] callArgsExpressions = MethodFactory.GetMethodCallArgsExpressions(method.GetParameters(), args); Expression expression = (Expression)Expression.Call(method.IsStatic ? (Expression)null : (Expression)unaryExpression, method, callArgsExpressions); if (method.ReturnType == typeof(void)) { expression = (Expression)Expression.Block(expression, (Expression)Expression.Default(typeof(object))); } return(new MethodFactory.ExpressionArgsPair() { Expression = expression, Parameters = new ParameterExpression[2] { parameterExpression, args } }); }