public static T ToGetInformation<T>(this DataTable dt, string RowName) where T:new()
        {
            T RowValue ;
            RowValue = dt.AsEnumerable().Where(w => { w.Field<T>(RowName); return true; }).Select(s => s).FirstOrDefault();
            return RowValue;
        }
现在的问题是 Select(s => s) 这边返回的数据类型无法强制转化为 T类型  
谁遇到过这个问题,求解决  
如何转化数据该类型 返回T类型的数据

解决方案 »

  1.   

    dt.AsEnumerable是什么类型啊,他跟T有什么关系,linq哪里知道AsEnumerable 后是T类型呢的列表呢,包括你的where选出的也没有指明是T类型
    指明类型是没问题的        private T MM<T>() where T: new()
            {
                List<T> list = new List<T>();
                T t = list.Where(x=>x!=null).Select(v => v).FirstOrDefault();
                return t;
            }
      

  2.   


    我这方法实际上实现的功能是 任何一个DataTable点这个扩展方法传入需要返回的类型以及这个DataTable中的某一列的列名,可以返回该列中该类型的值(这个DataTable只有一行)
      

  3.   

    你的select选择的是整行不是cell的值
    这么写 public static T ToGetInformation<T>(this DataTable dt, string RowName) where T : new()
            {
                T RowValue;
                RowValue = dt.AsEnumerable().First().Field<T>(RowName);
                return RowValue;
            }
      

  4.   

    Select(s => s as T)
      

  5.   

    dt.AsEnumerable的item类型和T有继承关系吗,没有的话强制转换也不行啊
      

  6.   

    你看我上面的解释,这个DataTable只有一行  所以是直接获取这一行中某一列的值
      

  7.   

    这个貌似没有继承关系,我的意思就是在我传入这个 DataTable的某一列的实际类型的时候,这个方法可以返回一个该类型的值
      

  8.   

            public static T ToGetInformation<T>(this DataTable dt, string RowName) where T:new()
            {
                T RowValue ;
                RowValue = dt.AsEnumerable().Where(w =>  w.Field<T>(RowName) is T; ).Select(s => sw.Field<T>(RowName)).FirstOrDefault();
                return RowValue;
            }
      

  9.   

    这代码写的,咋怎么别扭呢??where .select.firstordefault
    ??????为啥不直接firstordefault??
      

  10.   

    另外说一句,这种封装其实比较多余他并没有达到任何封装和简化的目的,因为外部调用的人其实还是必须知道他是啥T类型,如果说我知道是啥类型,我根本不需要你给我啥封装。我宁愿自己操作dt(标准操作,还不需要“背”你给的特殊规则)
      

  11.   


      public static List<T> DataTableConvertList<T>(this DataTable table) where T : class,new()
            {
                List<T> list = new List<T>();
                Type t=typeof(T);
                if (table == null || table.Rows.Count == 0)
                {
                    throw new Exception("DataTable is null ");
                }
                foreach (DataRow row in table.Rows)
                {
                    T obj = new T();
                    foreach (DataColumn column in table.Columns)
                    {
                        PropertyInfo property = t.GetProperty(column.ColumnName);
                        Type propertyType = property.PropertyType;
                        string value = row[column].ToString();
                        if (!property.CanWrite)
                        {
                           // throw new Exception("Property is readOnly");
                            continue;
                        }
                        if (propertyType == typeof(int?) || propertyType == typeof(int))
                        {
                            int tempVlaue;
                            if (!int.TryParse(value, out tempVlaue))
                            {
                                tempVlaue = 0;
                            }
                            property.SetValue(obj, tempVlaue, null);
                            continue;
                        }
                        if (propertyType == typeof(bool) || propertyType == typeof(bool?))
                        {
                            bool tempVlaue=false;
                            if (value == "是" || value == "1" || value.ToLower() == "true")
                            {
                                tempVlaue = true;
                            }
                            property.SetValue(obj, tempVlaue, null);
                            continue;
                        }
                        property.SetValue(obj, value, null);
                    }
                    list.Add(obj);
                }
                return list;
            }我也写了一个,还有很多类型没考虑到,其中烦一点的应该是自定义类型和枚举的转换.比如DataTable的ColumnName 是 Product.ProductPrice.BasicPrice 这种转换应该需要类都继承一个基类才能做到
      

  12.   

    就算DataTable里只有一行,它还是个表不能当成行来用,你还是得用.First()先把行取出来
    要么先取第一行再取列值
    dt.AsEnumeralbe().First().Field<T>("colName")
    要么先取列值再取第一行
    dt.AsEnumerable().Select(row=>row.Filed<T>("colName")).First()