예제 #1
0
        public static IList Map(Type objectType, IDataReader dataReader, ObjectPropertyConvertType convertType)
        {
            if (!TypeHelper.IsValueType(objectType))
            {
                return(Map(objectType, dataReader));
            }
            Type[] typeArguments = { objectType };
            var    list          = (IList)Activator.CreateInstance(ReflectorConsts.ListType.MakeGenericType(typeArguments));

            while (dataReader.Read())
            {
                if (!dataReader.IsDBNull(0))
                {
                    list.Add(dataReader.GetValue(0));
                }
            }
            return(list);
        }
예제 #2
0
        public static IList Map(Type objectType, DataSet ds, ObjectPropertyConvertType convertType)
        {
            var list       = (IList)Activator.CreateInstance(ReflectorConsts.ListObjectType);
            var setters    = ExpressionReflector.GetSetters(objectType);
            var properties = ExpressionReflector.GetProperties(objectType);
            var table1     = ds.Tables[0];

            foreach (DataRow row in ds.Tables[0].Rows)
            {
                object obj2 = null;
                if (objectType.IsSealed)
                {
                    var list2 = new List <object>();
                    foreach (DataColumn column in ds.Tables[0].Columns)
                    {
                        var item = row[column];
                        if (item == DBNull.Value)
                        {
                            item = null;
                        }
                        list2.Add(item);
                    }
                    if (TypeHelper.IsValueType(objectType))
                    {
                        obj2 = list2[0];
                    }
                    else
                    {
                        obj2 = ExpressionReflector.CreateInstance(objectType, convertType, list2.ToArray());
                    }
                }
                else
                {
                    obj2 = ExpressionReflector.CreateInstance(objectType, convertType);
                    foreach (DataColumn column2 in ds.Tables[0].Columns)
                    {
                        var obj4 = row[column2];
                        if (obj4 != DBNull.Value)
                        {
                            var info = properties[column2.ColumnName];
                            if (info != null)
                            {
                                var propertyType   = info.PropertyType;
                                var underlyingType = Nullable.GetUnderlyingType(propertyType);
                                if (underlyingType == null)
                                {
                                    underlyingType = propertyType;
                                }
                                if (underlyingType.IsEnum)
                                {
                                    obj4 = Enum.Parse(underlyingType, Convert.ToString(obj4));
                                }
                                else
                                {
                                    obj4 = Convert.ChangeType(obj4, underlyingType);
                                }
                                setters[column2.ColumnName](obj2, obj4);
                            }
                        }
                    }
                }
                list.Add(obj2);
            }
            return(list);
        }
예제 #3
0
        public static Func <object[], object> GetConstructor(Type type, ObjectPropertyConvertType convertType)
        {
            Func <object[], object> func = null;

            if (!_objectConstructors.TryGetValue(type, out func))
            {
                var dictionary = _objectConstructors;
                lock (dictionary)
                {
                    Expression expression;
                    if (_objectConstructors.TryGetValue(type, out func))
                    {
                        return(func);
                    }
                    var array = Expression.Parameter(ReflectorConsts.ObjectArrayType);
                    if (TypeHelper.IsValueType(type))
                    {
                        expression = Expression.New(type);
                    }
                    else
                    {
                        var constructor = type.GetConstructors()[0];
                        var list        = new List <Expression>();
                        var infoArray   = constructor.GetParameters();
                        for (var i = 0; i < infoArray.Length; i++)
                        {
                            var info2         = infoArray[i];
                            var expression3   = Expression.ArrayIndex(array, Expression.Constant(i));
                            var flag2         = TypeHelper.IsNullableType(info2.ParameterType);
                            var parameterType = info2.ParameterType;
                            if (flag2)
                            {
                                parameterType = TypeHelper.GetUnderlyingType(parameterType);
                            }
                            Expression expression4 = null;
                            if (convertType != ObjectPropertyConvertType.ConvertTo)
                            {
                                if (convertType == ObjectPropertyConvertType.Cast)
                                {
                                    expression4 = Expression.Convert(expression3, info2.ParameterType);
                                }
                            }
                            else
                            {
                                MethodInfo method = null;
                                if (parameterType == ReflectorConsts.DateTimeType)
                                {
                                    method = ReflectorConsts.ConvertToDateTimeMethod;
                                    Expression[] expressionArray1 = { expression3 };
                                    expression4 = Expression.Call(null, ReflectorConsts.ConvertToDateTimeMethod,
                                                                  expressionArray1);
                                }
                                else if (parameterType == ReflectorConsts.StringType)
                                {
                                    method = ReflectorConsts.ConvertToStringMethod;
                                }
                                else if (parameterType == ReflectorConsts.Int32Type)
                                {
                                    method = ReflectorConsts.ConvertToInt32Method;
                                }
                                else
                                {
                                    if (parameterType != ReflectorConsts.BoolType)
                                    {
                                        throw new Exception("不支持:" + parameterType);
                                    }
                                    method = ReflectorConsts.ConvertToBoolMethod;
                                }
                                Expression[] arguments = { expression3 };
                                expression4 = Expression.Call(null, method, arguments);
                                if (flag2)
                                {
                                    expression4 = Expression.Convert(expression4, info2.ParameterType);
                                }
                            }

                            list.Add(expression4);
                        }
                        expression = Expression.New(constructor, list.ToArray());
                    }
                    ParameterExpression[] parameters = { array };
                    func = Expression.Lambda <Func <object[], object> >(expression, parameters).Compile();
                    _objectConstructors.Add(type, func);
                }
            }
            return(func);
        }
예제 #4
0
 public static object CreateInstance(Type type, ObjectPropertyConvertType convertType, params object[] parameters)
 {
     return(GetConstructor(type, convertType)(parameters));
 }