最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#中DataTable轉(zhuǎn)化為List<T>解析

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

創(chuàng)新互聯(lián)建站客戶idc服務(wù)中心,提供中國電信云錦天府、成都服務(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)級技術(shù)保障。

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

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

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

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

       引用類型:引用類型不存儲它們所代表的實(shí)際數(shù)據(jù),但它們存儲實(shí)際數(shù)據(jù)的引用。主要包含:對象類型,類類 型,接口,代表元,字符串類型,數(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)換為List集合
        /// 
        /// 
        /// 
        /// 
        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#對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:
                    {
                        //引用類型 必須對泛型實(shí)例化
                        model = Activator.CreateInstance();
                        //獲取model中的屬性
                        var modelPropertyInfos = type.GetProperties();
                        //遍歷model每一個(gè)屬性并賦值DataRow對應(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;
        }

文章標(biāo)題:C#中DataTable轉(zhuǎn)化為List<T>解析
網(wǎng)站路徑:http://fisionsoft.com.cn/article/jposcj.html