2013-07-24 42 views
0

我有一个简单的问题,但我就可以了,因为今天早上...初始化列表<T>从GridView的数据源与反射的类型

我怎么能初始化一个List<T>,而不知道它的类型?或者(可能更简单)我可以在GridView.DataSource上做OrderBy吗?

这里我的代码,在这一刻:

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

这可能有助于http://stackoverflow.com/questions/13519910/converting-fieldinfo-value-to-a-list-whe n-list-type-not-known?rq = 1 –

+0

谢谢但不是,对我而言这不是件好事。我需要一种方法来在'List '上做一个orderBy,但是使用反射来初始化这个列表。 – Shadam

+0

如何定义this.DataSource? –

回答

1

假设你的item的类型实施IConvertible,这应该工作:

this.DataSource = ((IEnumerable<object>)this.DataSource).ToList() 
    .ConvertAll(item => Convert.ChangeType(item, type)) 
    .OrderBy(item => property.GetValue(item)); 
+0

你是个天才!非常感谢 !我很惊讶花了所有这些时间只是改变'List'到'IEnumerable' ... – Shadam

+0

不客气,保持它! –

1

亚历克斯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); 
    } 
} 
+0

是的,这种方法的工作原理也是如此,但建立^^ – Shadam

+0

这更复杂一点,但是您可以获得类型安全的优势。 :) –

相关问题