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类型。。但是没办法强制转换过来所以最终问题是,我怎么得到一个泛型的具体类型。。然后声明它。。泛型
List<A> myList = grid.DataSource as List<A>我前面一段List<A>中的A,我没法确定,由于泛形中要指定具体类型,这里又不能传任何变量,typeof, Type什么的都不行我可以得到A,知道他是A类型。。但是没办法强制转换过来所以最终问题是,我怎么得到一个泛型的具体类型。。然后声明它。。泛型
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);
}
}这是通过反射而到数据类型的例子
DataSource中的对象是List<A>
这么写
List<A> myList = grid.DataSource as List<A>;
没错。
既然没法确定,声明‘它’就没有具体的意义。
要泛用,你可以用非泛形的IList。
System.Collections.IList list = grid.DataSource as System.Collections.IList。