• C#用反射判断一个类型是否是Nullable同时获取它的根类型(转自网络)


    在我们的应用程序中我们使用类描述我们的业务对象,为我们产生一些报表之类的,那就依赖大量不同的对象,我们创建一个帮助方法来转换我们的业务对象,或是一个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]
  • 相关阅读:
    Python动态展示遗传算法求解TSP旅行商问题
    MOEAD算法中均匀权向量的实现---Python
    HDU 5294 多校第一场1007题 最短路+最小割
    POJ 3261 Milk Patterns sa+二分
    HDU 4292 FOOD 2012 ACM/ICPC Asia Regional Chengdu Online
    CodeForces 201A Clear Symmetry
    POJ 1679 The Unique MST 确定MST是否唯一
    POJ 3268 Silver Cow Party 最短路 基础题
    POJ 2139 SIx Degrees of Cowvin Bacon 最短路 水題
    POJ2229 Sumsets 基礎DP
  • 原文地址:https://www.cnblogs.com/caoheyang911016/p/3797169.html
Copyright © 2020-2023  润新知