0

是否可以订购 System.Collection.IList 而无需将其转换为已知类型?

我收到一个列表object并将其转换为 IList 使用

var listType = typeof(List<>);
var cListType = listType.MakeGenericType(source.GetType());
var p = (IList)Activator.CreateInstance(cListType);
var s = (IList)source;                

我想根据 ID 订购它,它可能可用也可能不可用。

我想产生的是这样的:

if (s.First().GetType().GetProperties().where(m=>m.Name.Contians("Id")).FirstOrDefault != null)
{
     s=s.OrderBy(m=>m.Id);
}

但是,s 没有扩展方法“Order”,也没有扩展方法“First”

4

1 回答 1

1

尝试下一个代码。如果您的类型没有id属性,它将不会排序source

void Main()
{
    var source = typeof(Student);

    var listType = typeof(List<>);
    var cListType = listType.MakeGenericType(source);
    var list = (IList)Activator.CreateInstance(cListType);

    var idProperty = source.GetProperty("id");

    //add data for demo
    list.Add(new Student{id = 666});
    list.Add(new Student{id = 1});
    list.Add(new Student{id = 1000});

    //sort if id is found
    if(idProperty != null)
    {
        list = list.Cast<object>()
                   .OrderBy(item => idProperty.GetValue(item))
                   .ToList();
    }

    //printing to show that list is sorted
    list.Cast<Student>()
        .ToList()
        .ForEach(s => Console.WriteLine(s.id));
}

class Student
{
    public int id { get; set; }
}

印刷:

1
666
1000
于 2013-04-17T10:06:30.663 回答