Beispiel #1
0
        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);
        }