C#用反射判斷一個類型是否是Nullable同時擷取它的根類型

來源:互聯網
上載者:User

標籤:tty   datatable   color   int   nbsp   ati   ica   border   generic   

在我們的應用程式中我們使用類描述我們的業務對象,為我們產生一些報表之類的,那就依賴大量不同的對象,我們建立一個協助方法來轉換我們的業務對象,或是一個List的業務對象到DataTables.

由於資料庫表中欄位可為null,對應.net 2.0以後我們可用Nullable類型來實現,那當我們業務對象類中欄位有null時,並需要轉換為DataTable時,這個情境產生,你可能用到以下方法:

下面的代碼是一個list對象(不支援處理複雜類型)返回一個描述對象的DataTable

/// <summary> /// Converts a Generic List into a DataTable /// </summary> /// <param name="list"></param> /// <param name="typ"></param> /// <returns></returns> private DataTable GetDataTable(IList list, Type typ) {     DataTable dt = new DataTable();     // Get a list of all the properties on the object     PropertyInfo[] pi = typ.GetProperties();     // Loop through each property, and add it as a column to the datatable     foreach (PropertyInfo p in pi)     {         // The the type of the property         Type columnType = p.PropertyType;         // We need to check whether the property is NULLABLE         if (p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))         {             // If it is NULLABLE, then get the underlying type. eg if "Nullable<int>" then this will return just "int"             columnType = p.PropertyType.GetGenericArguments()[0];         }         // Add the column definition to the datatable.         dt.Columns.Add(new DataColumn(p.Name, columnType));     }     // For each object in the list, loop through and add the data to the datatable.     foreach (object obj in list)     {         object[] row = new object[pi.Length];         int i = 0;         foreach (PropertyInfo p in pi)         {             row[i++] = p.GetValue(obj, null);         }         dt.Rows.Add(row);     }     return dt; }

 

上面的代碼的關鍵點:

  • 用 PropertyType.IsGenericType 決定property是否是generic類型
  • 用 ProprtyType.GetGenericTypeDefinition() == typeof(Nullable<>) 檢測它是否是一個nullable類型
  • 用 PropertyType.GetGenericArguments() 擷取基底類型。

下面讓我們來應用一下:

public class Person{    public string Name { get; set; }    public DateTime DateOfBirth { get; set; }    public DateTime? DateOfDeath { get; set; }}public class Example{    public static DataTable RunExample()    {        Person edward = new Person() { Name = "Edward", DateOfBirth = new DateTime(1900, 1, 1), DateOfDeath = new DateTime(1990, 10, 15) };        Person margaret = new Person() { Name = "Margaret", DateOfBirth = new DateTime(1950, 2, 9), DateOfDeath = null };        Person grant = new Person() { Name = "Grant", DateOfBirth = new DateTime(1975, 6, 13), DateOfDeath = null };        List<Person> people = new List<Person>();        people.Add(edward);        people.Add(margaret);        people.Add(grant);        DataTable dt = GetDataTable(people, typeof(Person));        return dt;    }}

 

將返回的DataTable像下面的內容:

Name (string) DateOfBirth (DateTime) DateOfDeath (DateTime)
Edward 1/1/1900 15/10/1990
Margaret 9/2/1950 [NULL]
Grant 13/6/1975 [NULL]

 

 

 

 

實際開發中應用

    /// <summary>         /// 集合裝換DataSet         /// </summary>         /// <param name="list">集合</param>         /// <returns></returns>         /// 2008-08-01 22:08 HPDV2806         public static DataSet ToDataSet<T>(IList<T> p_List)        {            DataSet result = new DataSet();            DataTable _DataTable = new DataTable();            if (p_List.Count > 0)            {                PropertyInfo[] propertys = p_List[0].GetType().GetProperties();                foreach (PropertyInfo pi in propertys)                {                    if (pi.PropertyType.IsGenericType && pi.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))                    {                            _DataTable.Columns.Add(pi.Name, pi.PropertyType.GetGenericArguments()[0]);                    }                    else                    {                        _DataTable.Columns.Add(pi.Name, pi.PropertyType);                    }                 }                for (int i = 0; i < p_List.Count; i++)                {                    ArrayList tempList = new ArrayList();                    foreach (PropertyInfo pi in propertys)                    {                        object obj = pi.GetValue(p_List[i], null);                        tempList.Add(obj);                    }                    object[] array = tempList.ToArray();                    _DataTable.LoadDataRow(array, true);                }            }            result.Tables.Add(_DataTable);            return result;        }

 

 

 

參考:76708225

 

C#用反射判斷一個類型是否是Nullable同時擷取它的根類型

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.