真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C#中DataTable轉(zhuǎn)化為L(zhǎng)ist<T>解析

   在.net項(xiàng)目中使用到DataTable和List集合的地方較多, 泛型的好處: 它為使用c#語(yǔ)言編寫面向?qū)ο蟪绦蛟黾恿藰O大的效力和靈活性。不會(huì)強(qiáng)行對(duì)值類型進(jìn)行裝箱和拆箱,或?qū)σ妙愋瓦M(jìn)行。當(dāng)涉及到兩者之間的轉(zhuǎn)換時(shí),就顯得有些較為繁瑣。這個(gè)其中的問題主要在兩者的存儲(chǔ)方式,DataTable的存儲(chǔ)方式采用一種二維表的方式進(jìn)行數(shù)據(jù)的存儲(chǔ)操作,DataTable表示內(nèi)存中數(shù)據(jù)的一個(gè)表。在List集合中,List的本質(zhì)就是一個(gè)數(shù)組,則采用一種線性結(jié)構(gòu)對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)。

創(chuàng)新互聯(lián)建站客戶idc服務(wù)中心,提供中國(guó)電信云錦天府、成都服務(wù)器、成都主機(jī)托管、成都雙線服務(wù)器等業(yè)務(wù)的一站式服務(wù)。通過各地的服務(wù)中心,我們向成都用戶提供優(yōu)質(zhì)廉價(jià)的產(chǎn)品以及開放、透明、穩(wěn)定、高性價(jià)比的服務(wù),資深網(wǎng)絡(luò)工程師在機(jī)房提供7*24小時(shí)標(biāo)準(zhǔn)級(jí)技術(shù)保障。

   在轉(zhuǎn)換過程中,主要的問題在于不同類型的處理上,主要分為值類型和引用類型兩大類。

       C#中值類型總是含有相應(yīng)該類型的一個(gè)值,指類型包含:簡(jiǎn)單類型(Simple types ),結(jié)構(gòu)類型(struct types),枚舉類型(Enumeration types)。

       簡(jiǎn)單類型包含:整型,布爾型,字符型 (整型的一種特殊情況),浮點(diǎn)型,小數(shù)型。

       整型包含: sbyte 、byte、 short、 ushort、 int、 uint、 long、 ulong 和 char。

       引用類型:引用類型不存儲(chǔ)它們所代表的實(shí)際數(shù)據(jù),但它們存儲(chǔ)實(shí)際數(shù)據(jù)的引用。主要包含:對(duì)象類型,類類 型,接口,代表元,字符串類型,數(shù)組。

    現(xiàn)提供轉(zhuǎn)換的代碼,僅供參考:

1.類型枚舉:

        /// 
        /// 類型枚舉
        /// 
        private enum ModelType
        {
            //值類型
            Struct,
            Enum,
            //引用類型
            String,
            Object,
            Else
        }


        private static ModelType GetModelType(Type modelType)
        {
            //值類型
            if (modelType.IsEnum)
            {
                return ModelType.Enum;
            }
            //值類型
            if (modelType.IsValueType)
            {
                return ModelType.Struct;
            }
            //引用類型 特殊類型處理
            if (modelType == typeof(string))
            {
                return ModelType.String;
            }
            //引用類型 特殊類型處理
            return modelType == typeof(object) ? ModelType.Object : ModelType.Else;
        }

2.具體的轉(zhuǎn)換操作方法:

        /// 
        /// datatable轉(zhuǎn)換為L(zhǎng)ist集合
        /// 
        /// 
        /// 
        /// 
        public static List DataTableToList(DataTable table)
        {
            var list = new List();
            foreach (DataRow item in table.Rows)
            {
                list.Add(DataRowToModel(item));
            }
            return list;
        }

        public static T DataRowToModel(DataRow row)
        {
            T model;
            var type = typeof(T);
            var modelType = GetModelType(type);
            switch (modelType)
            {
                //值類型
                case ModelType.Struct:
                    {
                        model = default(T);
                        if (row[0] != null)
                            model = (T)row[0];
                    }
                    break;
                //值類型
                case ModelType.Enum:
                    {
                        model = default(T);
                        if (row[0] != null)
                        {
                            var fiType = row[0].GetType();
                            if (fiType == typeof(int))
                            {
                                model = (T)row[0];
                            }
                            else if (fiType == typeof(string))
                            {
                                model = (T)Enum.Parse(typeof(T), row[0].ToString());
                            }
                        }
                    }
                    break;
                //引用類型 c#對(duì)string也當(dāng)做值類型處理
                case ModelType.String:
                    {
                        model = default(T);
                        if (row[0] != null)
                            model = (T)row[0];
                    }
                    break;
                //引用類型 直接返回第一行第一列的值
                case ModelType.Object:
                    {
                        model = default(T);
                        if (row[0] != null)
                            model = (T)row[0];
                    }
                    break;
                //引用類型
                case ModelType.Else:
                    {
                        //引用類型 必須對(duì)泛型實(shí)例化
                        model = Activator.CreateInstance();
                        //獲取model中的屬性
                        var modelPropertyInfos = type.GetProperties();
                        //遍歷model每一個(gè)屬性并賦值DataRow對(duì)應(yīng)的列
                        foreach (var pi in modelPropertyInfos)
                        {
                            //獲取屬性名稱
                            var name = pi.Name;
                            if (!row.Table.Columns.Contains(name) || row[name] == null) continue;
                            var piType = GetModelType(pi.PropertyType);
                            switch (piType)
                            {
                                case ModelType.Struct:
                                    {
                                        var value = Convert.ChangeType(row[name], pi.PropertyType);
                                        pi.SetValue(model, value, null);
                                    }
                                    break;
                                case ModelType.Enum:
                                    {
                                        var fiType = row[0].GetType();
                                        if (fiType == typeof(int))
                                        {
                                            pi.SetValue(model, row[name], null);
                                        }
                                        else if (fiType == typeof(string))
                                        {
                                            var value = (T)Enum.Parse(typeof(T), row[name].ToString());
                                            if (value != null)
                                                pi.SetValue(model, value, null);
                                        }
                                    }
                                    break;
                                case ModelType.String:
                                    {
                                        var value = Convert.ChangeType(row[name], pi.PropertyType);
                                        pi.SetValue(model, value, null);
                                    }
                                    break;
                                case ModelType.Object:
                                    {
                                        pi.SetValue(model, row[name], null);
                                    }
                                    break;
                                case ModelType.Else:
                                    throw new Exception("不支持該類型轉(zhuǎn)換");
                                default:
                                    throw new Exception("未知類型");
                            }
                        }
                    }
                    break;
                default:
                    model = default(T);
                    break;
            }
            return model;
        }

名稱欄目:C#中DataTable轉(zhuǎn)化為L(zhǎng)ist<T>解析
當(dāng)前網(wǎng)址:http://weahome.cn/article/jposcj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部