程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 如何將DataRow轉換成相應的對象

如何將DataRow轉換成相應的對象

編輯:關於ASP.NET

一直以來對框架非常感興趣,對大多數框架(目前本人看過的)來說一般分為三個部分:

(1): 拼接SQL語句(反射)。

(2):執行CRUD操作,獲取相應的DataTable、DataSet等等。

(3) :將相應的DataTable、DataSet轉換成對象(反射)。

因此可以將上述3個部分各個擊破,一步一步來 實現自己的框架,看的框架多了,也就成了路。反射在這裡面被淋漓盡致的運用,哈哈,站在款哥的肩膀 上......

(一)通用以及泛型轉換代碼

先看下面關於將DataRow轉換成相應的對象(通用以及 泛型操作)的方法(這裡僅僅是對DataRow進行轉換,對於將DataTable轉換成對象集合,思路基本差不多,因 此本例裡不再對其他的進行相關代碼的編寫):

public class Mapper
    {
        public static object ToEntity(DataRow adaptedRow, Type entityType)
        {
            if (entityType == null || adaptedRow == null)
            {
                return null;
            }
    
            object entity = Activator.CreateInstance(entityType);
            CopyToEntity(entity, adaptedRow);
    
            return entity;
        }
    
        public static T ToEntity<T>(DataRow adaptedRow, T value) where T:new()
        {
            T item = new T();
            if (value == null || adaptedRow == null)
            {
                return item;
            }
    
            item = Activator.CreateInstance<T>();
            CopyToEntity(item, adaptedRow);
    
            return item;
        }
    
        public static void CopyToEntity(object entity, DataRow adaptedRow)
        {
            if (entity == null || adaptedRow == null)
            {
                return;
            }
            PropertyInfo[] propertyInfos = entity.GetType().GetProperties();
    
            foreach (PropertyInfo propertyInfo in propertyInfos)
            {
                if (!CanSetPropertyValue(propertyInfo, adaptedRow))
                {
                    continue;
                }
    
                try
                {
                    if (adaptedRow[propertyInfo.Name] is DBNull)
                    {
                        propertyInfo.SetValue(entity, null, null);
                        continue;
                    }
                    SetPropertyValue(entity, adaptedRow, propertyInfo);
                }
                finally
                {
    
                }
            }
        }
    
        private static bool CanSetPropertyValue(PropertyInfo propertyInfo, DataRow adaptedRow)
        {
            if (!propertyInfo.CanWrite)
            {
                return false;
            }
    
            if (!adaptedRow.Table.Columns.Contains(propertyInfo.Name))
            {
                return false;
            }
    
            return true;
        }
    
        private static void SetPropertyValue(object entity, DataRow adaptedRow, PropertyInfo propertyInfo)
        {
            if (propertyInfo.PropertyType == typeof(DateTime?) ||
                propertyInfo.PropertyType == typeof(DateTime))
            {
                DateTime date = DateTime.MaxValue;
                DateTime.TryParse(adaptedRow[propertyInfo.Name].ToString(),
                    CultureInfo.CurrentCulture, DateTimeStyles.None, out date);
    
                propertyInfo.SetValue(entity, date, null);
            }
            else
            {
                propertyInfo.SetValue(entity, adaptedRow[propertyInfo.Name], null);
            }
        }
    }

以上的代碼主要是針對將DataRow轉換成相應的對象,方法為

(1)public static object ToEntity(DataRow adaptedRow, Type entityType)
(2)public static T ToEntity<T>(DataRow adaptedRow, T value) where T:new()

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved