簡體   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