繁体   English   中英

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

[英]How to work with Generic type members in extension method?

我开始使用这种扩展方法很有趣,但是现在我发现自己陷入其中,

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

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

它将返回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表达式访问通用类成员:即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>作为参数的原因,再次廉价地概括一下; 为什么只接受清单? 为什么不使用数组,队列,堆栈,集合,迭代器块,哈希集等?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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