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