grid的DataSource,是一个List<T>。。T都是自定义类型。。每个页面不一样。。我在一个方法里面得到DataSource,怎么转成List<具体T>?。。例如grid绑定的是List<A>。。我在方法中得到object,查看类型是List<A>,但是我没法转换出来?类似这样:
List<A> myList = grid.DataSource as List<A>我前面一段List<A>中的A,我没法确定,由于泛形中要指定具体类型,这里又不能传任何变量,typeof, Type什么的都不行我可以得到A,知道他是A类型。。但是没办法强制转换过来所以最终问题是,我怎么得到一个泛型的具体类型。。然后声明它。。泛型

解决方案 »

  1.   


    Object[] datalist = (DataSource as IEnumerable<Object>).ToArray();
    if (datalist.Length == 0)
    {
        return;
    }
    Type sourceType = datalist[0].GetType();
    PropertyInfo[] properties = sourceType.GetProperties();
    PropertyInfo groupFieldInfo = GetPropertyInfo(properties, this.GroupTextField);
    PropertyInfo dataValueFieldInfo = GetPropertyInfo(properties, this.DataValueField);
    PropertyInfo dataTextFieldInfo = GetPropertyInfo(properties, this.DataTextField);
    List<GroupItem> groupItemList = new List<GroupItem>();
    foreach (var item in datalist)
    {
        GroupItem groupItem = new GroupItem();
        groupItem.GroupName = sourceType.InvokeMember(groupFieldInfo.Name, BindingFlags.GetProperty, null, item, null).ToString();
        groupItem.DataValue = sourceType.InvokeMember(dataValueFieldInfo.Name, BindingFlags.GetProperty, null, item, null).ToString();
        groupItem.DataText = sourceType.InvokeMember(dataTextFieldInfo.Name, BindingFlags.GetProperty, null, item, null).ToString();
        groupItemList.Add(groupItem);
    }
    ViewState["ItemGroups"] = groupItemList;private PropertyInfo GetPropertyInfo(PropertyInfo[] properties, string propertyName)
    {
        PropertyInfo propertyInfo = null;
        if (properties.Where(t => string.Equals(t.Name, propertyName, StringComparison.OrdinalIgnoreCase)).Count() > 1)
        {
            throw new InvalidOperationException("Too many field:" + propertyName);
        }
        try
        {
            propertyInfo = properties.Single(t => string.Equals(t.Name, propertyName, StringComparison.OrdinalIgnoreCase));
            return propertyInfo;
        }
        catch
        {
            throw new InvalidOperationException("Fount not field:" + propertyName);
        }
    }这是通过反射而到数据类型的例子
      

  2.   

    诚如你说
    DataSource中的对象是List<A>
    这么写
    List<A> myList = grid.DataSource as List<A>;
    没错。
     
      

  3.   


    既然没法确定,声明‘它’就没有具体的意义。
    要泛用,你可以用非泛形的IList。
    System.Collections.IList list = grid.DataSource as System.Collections.IList。
      

  4.   

    枚举遍历类型  然后Swith 什么的都行