繁体   English   中英

使用反射排序的扩展方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM