如何在扩展方法中使用泛型类型成员?

How to work with Generic type members in extension method?

我开始这个扩展方法是为了好玩,但现在我发现自己陷入其中,

实际上我想创建一个扩展方法来扩展 LINQ,该方法将如下所示:

books.In(b => b.Id, 1,2,3,4,5);

它将 return 本书 ID 范围在第二 params[] ,

也可以这样做:

books.In(b => b.Title, "t1","t2","t3","t4","t5");

我想到的就是这个方法(我今天才知道表达式树!):

 public static List<TEntity> In<TEntity, TMember>(this List<TEntity> list,
            Expression<Func<TEntity, TMember>> identifier, params TMember[] keys)
        {
            Type t = typeof(TEntity); //How to use reflection here?

            List<TEntity> myList = list.Where(m => keys.Contains(m.));
            return myList;
        }

我的问题是如何从 identifier 表达式访问通用 class 成员:即 m.Idm.Title? 我可以使用反射来实现吗?

应该这样做:

public static IEnumerable<TEnitity> In<TEnitity, TMember>(
    this IEnumerable<TEnitity> source, 
    Func<TEnitity, TMember> projector, IEnumerable<TMember> validCases)
{
    var validSet = new HashSet<TMember>(validCases);
    return source.Where(s => validSet.Contains(projector(s)));
}

或者,为了完全符合您提议的签名:

public static IEnumerable<TEntity> In<TEntity, TMember>(
    this IEnumerable<TEntity> source,
    Func<TEntity, TMember> projector, params TMember[] validCases)
{
    var validSet = new HashSet<TMember>(validCases);
    return source.Where(s => validSet.Contains(projector(s)));
}

关于我为什么返回 IEnumerable<T> 而不是 List<T> 的原因是廉价的概括;如果消费者想要返回一个列表,那么他只需要调用ToList,但如果他可能只想通过枚举迭代一次,为什么要让他付出贪婪枚举的代价呢?请记住,LINQ 是 惰性 ,利用它并​​尽可能少地工作。

关于为什么我接受 IEnumerable<T> 作为论点,又是一种廉价的概括;为什么只接受一个列表?为什么不是数组、队列、堆栈、集合、迭代器块、哈希集等?