[英]Extension method using Reflection to Sort
我實現了擴展“ MyExtensionSortMethod”來對集合進行排序(IEnumerate)。 這使我可以將“ entities.OrderBy(...).ThenByDescending(...)”等代碼替換為“ entities.MyExtensionSortMethod()”(也沒有參數)。
這是一個實現示例:
//test function
function Test(IEnumerable<ClassA> entitiesA,IEnumerable<ClassB> entitiesB ) {
//Sort entitiesA , based on ClassA MySort method
var aSorted = entitiesA.MyExtensionSortMethod();
//Sort entitiesB , based on ClassB MySort method
var bSorted = entitiesB.MyExtensionSortMethod();
}
//Class A definition
public classA: IMySort<classA> {
....
public IEnumerable<classA> MySort(IEnumerable<classA> entities)
{
return entities.OrderBy( ... ).ThenBy( ...);
}
}
public classB: IMySort<classB> {
....
public IEnumerable<classB> MySort(IEnumerable<classB> entities)
{
return entities.OrderByDescending( ... ).ThenBy( ...).ThenBy( ... );
}
}
//extension method
public static IEnumerable<T> MyExtensionSortMethod<T>(this IEnumerable<T> e) where T : IMySort<T>, new()
{
//the extension should call MySort of T
Type t = typeof(T);
var methodInfo = t.GetMethod("MySort");
//invoke MySort
var result = methodInfo.Invoke(new T(), new object[] {e});
//Return
return (IEnumerable < T >)result;
}
public interface IMySort<TEntity> where TEntity : class
{
IEnumerable<TEntity> MySort(IEnumerable<TEntity> entities);
}
但是,與它相比,它似乎有點復雜,所以我想知道它們是否是另一種方法?
您為什么不為此使用謂詞 ? 這樣可以使您作為代表通過排序條件 。
以下示例未進行排序,但應作為該技術的一個不錯的示例:
private class Book
{
public string Author { get; set; }
public string Name { get; set; }
public DateTime Published { get; set; }
}
//Create and fill a list of books
private List<Book> Books = new List<Book> {
new Book { Author="Mcconnell",Name="Code Complete", Published=new DateTime(1993,05,14) },
new Book { Author="Sussman",Name="SICP (2nd)", Published=new DateTime(1996,06,01) },
new Book { Author="Hunt",Name="Pragmatic Programmer", Published=new DateTime(1999,10,30) },
};
// returns a new collection of books containing just SICP and Pragmatic Programmer.
private IEnumerable<Book> BooksPublishedAfter1995()
{
return Books.FindAll(Book => Book.Published > new DateTime(1995, 12, 31));
}
http://www.rvenables.com/tag/predicates/
再說一次,現在我們回到OrderBy,不是嗎?
如果要為對象指定自定義排序,則可以在類上實現IComparable接口。 請參閱下面的文章,其中介紹了如何執行此操作:
實現IComparable對自定義對象進行排序
http://codebetter.com/blogs/david.hayden/archive/2005/02/27/56099.aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.