public LateBoundCtor CreateCtor(Type type) { LateBoundCtor ctor = _ctorCache.GetOrAdd(type, t => { //handle valuetypes if (!type.IsClass) { var ctorExpression = Expression.Lambda <LateBoundCtor>(Expression.Convert(Expression.New(type), typeof(object))); return(ctorExpression.Compile()); } else { var constructors = type.GetConstructors(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); //find a ctor with only optional args var ctorWithOptionalArgs = constructors.FirstOrDefault(c => c.GetParameters().All(p => p.IsOptional)); if (ctorWithOptionalArgs == null) { throw new ArgumentException("Type needs to have a constructor with 0 args or only optional args", "type"); } //get all optional default values var args = ctorWithOptionalArgs .GetParameters() .Select(p => Expression.Constant(p.DefaultValue, p.ParameterType)).ToArray(); //create the ctor expression var ctorExpression = Expression.Lambda <LateBoundCtor>(Expression.Convert(Expression.New(ctorWithOptionalArgs, args), typeof(object))); return(ctorExpression.Compile()); } }); return(ctor); }
public void Test_with_value_object_create_ctor() { var sourceType = typeof(ValueSource); LateBoundCtor ctor = DelegateFactory.CreateCtor(sourceType); var target = ctor(); target.ShouldBeType <ValueSource>(); }
public void Test_with_create_ctor() { var sourceType = typeof(Source); LateBoundCtor ctor = DelegateFactory.CreateCtor(sourceType); var target = ctor(); target.ShouldBeInstanceOf <Source>(); }
public static LateBoundCtor CreateCtor(Type type) { LateBoundCtor ctor = _ctorCache.GetOrAdd(type, t => { var ctorExpression = Expression.Lambda <LateBoundCtor>(Expression.Convert(Expression.New(type), typeof(object))); return(ctorExpression.Compile()); }); return(ctor); }