关于泛型集合,和反射该 怎么用呢?
具体的说一 下,我现在遇到的一个问题。我现在定义了这样一个方法 
public void ExcelOut(List <T> arr,string path,params string[] headers)
其中怎样通过反射得到 arr的类型呢,因为这是一个commhelper 类,别的类在调用它时都会给它赋上不同的类型 ,而且所赋的类型还都是 一个class 类型,我还想得到里面的字段和方法,是不是通过GetProperties这个方法,求解。关于泛型集合和反射的用法,说的越细越好,有实例更好。谢谢!!

解决方案 »

  1.   

    属性是GetProperties方法,字段是GetFields方法, 方法是GetMethods方法,, 全部获取是GetMembers方法泛型反射后所得类型对象的IsGeneric属性是True, 它的T类型可以根据属性获取
      

  2.   


    Type t = arr.GetType().GetGenericArguments()[0].MakeGenericType();这样得到的t就是泛型集合中的元素的类型
    对泛型进行反射,可以参考我的博客:
    http://blog.csdn.net/ojlovecd/article/details/2943968
      

  3.   

    问题已经解决 了,献上代码  class CommHelper<T> 
        {
            #region NPOI Excel导出功能 +ExcelOut(List<T> arr, string path, List<string> Attries, List<string > headers)
            public static  void ExcelOut(List<T> arr, string path, List<string> Attries, List<string > headers)
            {
                try
                {
                    HSSFWorkbook wb = new HSSFWorkbook();//创建一个工作薄
                    HSSFSheet sheet = wb.CreateSheet();//在工作薄中创建一个工作表
                    for (int i = 0; i < headers.Count; i++) //循环一个表头来创建第一行的表头
                    {
                        HSSFRow rw = sheet.CreateRow(0);
                        rw.CreateCell(i).SetCellValue(headers[i]);
                    }
                    Type t = typeof(T); //获取得泛型集合中的实体, 返回T的类型
                    PropertyInfo[] properties = t.GetProperties(); //返回当前获得实体后 实体类型中的所有公共属性
                    for (int i = 0; i < arr.Count; i++)//循环实体泛型集合
                    {
                        HSSFRow rw = sheet.CreateRow(i + 1);//创建一个新行,把传入集合中的每条数据创建一行
                        foreach (PropertyInfo property in properties)//循环得到的所有属性(想要把里面指定的属性值导出到Excel文件中)
                        {
                            for (int j = 0; j < Attries.Count;j++ )//循环需要导出属性值 的 属性名
                            {
                                string attry = Attries[j];//获得一个需要导入的属性名;
                                if (string.Compare(property.Name.ToUpper(), attry.ToUpper()) == 0)//如果需要导出的属性名和当前循环实体的属性名一样,
                                {
                                    object result = property.GetValue(arr[i], null);//获取当前循环的实体属性在当前实体对象(arr[i])的值
                                    rw.CreateCell(j).SetCellValue((result == null) ? string.Empty : result.ToString());//创建单元格并进行赋值
                                }
                            }
                        }
                    }
                    using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite))
                    {
                        wb.Write(fs);
                    }
                }
                catch (Exception ex)
                {                throw new Exception("在导出Excel时文件出错啦=====" + ex.Message);
                }
            } 
            #endregion
        }