private void CreateConstructor(Binder.BaseTypeConfig cTarget) { Expression expr; switch (cTarget.ConstructorType) { case Binder.BaseTypeConfig.ConstructorTypeConfig.NoArguments: { expr = Expression.New(cTarget.TargetType); break; } case Binder.BaseTypeConfig.ConstructorTypeConfig.Values: { expr = CreateExpressionConstructor(cTarget.TargetType.GetConstructor(cTarget.ConstructorArguments), ci => CreateExpressions(ci, cTarget.ConstructorValues())); break; } case Binder.BaseTypeConfig.ConstructorTypeConfig.Action: { expr = CreateExpressionConstructor(FindConstructor(cTarget.TargetType), ci => ci.GetParameters().Select(p => CreateParameterExpression(p)).ToArray()); break; } case Binder.BaseTypeConfig.ConstructorTypeConfig.NoValue: { expr = CreateExpressionConstructor(FindConstructor(cTarget.TargetType), ci => ci.GetParameters().Select(p => CreateParameterExpression(p)).ToArray()); break; } default: throw new ArgumentException("Unexpected value in Binder.BaseTypeConfig.ConstructorTypeConfig"); } cTarget.Constructor = Expression.Lambda<Func<object>>(expr).Compile(); }