实现通用扩展

本文关键字:扩展 实现 | 更新日期: 2023-09-27 18:25:33

我有一个扩展IList<>的方法对于我需要执行的特殊订单。它接受一个IDisplayOrderable的IList和一个整数forRandom,并返回一个有序列表,但将DisplayOrder等于forRandom参数的项随机化。

public static IList<IDisplayOrderable> ReorderList(this IList<IDisplayOrderable> lstMain, int forRandom)
{
    List<IDisplayOrderable> result = new List<IDisplayOrderable>();
    Random rnd = new Random();
    result.AddRange(lstMain.Where(x => x.DisplayOrder.GetValueOrDefault(int.MaxValue) < forRandom).OrderBy(x => x.DisplayOrder.GetValueOrDefault(int.MaxValue)));
    result.AddRange(lstMain.Where(x => x.DisplayOrder.GetValueOrDefault(int.MaxValue) == forRandom).Shuffle(rnd));
    result.AddRange(lstMain.Where(x => x.DisplayOrder.GetValueOrDefault(int.MaxValue) > forRandom).OrderBy(x => x.DisplayOrder.GetValueOrDefault(int.MaxValue)));
    return result;
}

IDisplayOrderable是一个简单的接口,用于公开DisplayOrder以对不同类型进行排序。

public interface IDisplayOrderable
{
    Nullable<int> DisplayOrder { get; set; }
}

我想实现相同的功能,但对于我希望显式设置"OrderBy"属性的泛型列表,类似于:MyList.ReorderList(x=>x.DisplayOrder, 1000),但也包括MyOtherList.ReorderList(x=>x.OtherDisplayOrder, 1000)。为了做到这一点,我读了一些关于反思的文章,但还没有找到有效的方法。如有任何帮助或指导,将不胜感激

实现通用扩展

更改ReorderList方法,使其接受返回所需属性值的委托:

public static IList<T> ReorderList(this IList<T> lstMain,Func<T,int?> getter, int forRandom)
{
    List<T> result = new List<T>();
    Random rnd = new Random();
    result.AddRange(lstMain.Where(x => getter(x).GetValueOrDefault(int.MaxValue) < forRandom).OrderBy(x => getter(x).GetValueOrDefault(int.MaxValue)));
    result.AddRange(lstMain.Where(x => x.getter(x).GetValueOrDefault(int.MaxValue) == forRandom).Shuffle(rnd));
    result.AddRange(lstMain.Where(x => getter(x).GetValueOrDefault(int.MaxValue) > forRandom).OrderBy(x => xgetter(x).GetValueOrDefault(int.MaxValue)));
    return result;
}

并称之为:

MyOtherList.ReorderList(x=>x.OtherDisplayOrder, 1000)