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