我有一个简单的问题但我今天上午就开始......
如何在不知道其类型的情况下初始化List<T>
?或者(可能更简单)我可以在OrderBy
上进行GridView.DataSource
吗?
此时我的代码在这里:
Type type = (from asm in AppDomain.CurrentDomain.GetAssemblies()
from item in asm.GetTypes()
where item.IsClass && item.Name.Equals(myType)
select item).Single();
PropertyInfo property = type.GetProperty(myProperty);
this.DataSource = ((List<object>)this.DataSource)
.ConvertAll(item => Convert.ChangeType(item, type))
.OrderBy(item => type.InvokeMember(property.Name, BindingFlags.GetProperty, null, item, null));
欢迎任何建议:)
编辑:也许我需要告诉你第一个演员(List<object>)this.DataSource
失败了,我需要写一些(List<myType>)this.DataSource
代替。
答案 0 :(得分:1)
假设您正在为IConvertible
的类型实施item
,这应该有效:
this.DataSource = ((IEnumerable<object>)this.DataSource).ToList()
.ConvertAll(item => Convert.ChangeType(item, type))
.OrderBy(item => property.GetValue(item));
答案 1 :(得分:1)
Alex Filipovici的另一种方法是使用通用方法和表达式:
public class Shadam
{
object DataSource { get; set; }
public void OrderList(string myType, string myProperty)
{
Type type = (from asm in AppDomain.CurrentDomain.GetAssemblies()
from item in asm.GetTypes()
where item.IsClass && item.Name.Equals(myType)
select item).Single();
var property = type.GetProperty(myProperty);
typeof(Shadam).GetMethod("OrderGenericList")
.MakeGenericMethod(type, property.PropertyType)
.Invoke(this, new[] { property });
}
public void OrderGenericList<T, TProperty>(PropertyInfo property)
{
var tParameter = Expression.Parameter(typeof(T));
var orderExpression = Expression.Lambda<Func<T, TProperty>>(
Expression.Property(tParameter, property),
tParameter
).Compile();
this.DataSource = ((List<T>)this.DataSource).OrderBy(orderExpression);
}
}
答案 2 :(得分:0)
在分配数据表之前订购列表并不容易吗?或者使用GridView.Sort?
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.sort.aspx