我有一个具有许多DateTime
属性的简单类:
public class MyClass
{
public DateTime Created {get; set;}
public DateTime LastChanged {get; set;}
public DateTime LastAccessed {get; set;}
...
}
稍后,在我的代码中的某个地方,我想MyClass
根据这些属性来过滤的集合。对于每个属性,我想做这样的事情:
myQueryableOfMyClass = myQueryableOfMyClass.Where(a => ((begin == null) || (a.Created >= begin)) && ((end == null) || (a.Created <= end));
如果我必须为我的每个DateTime
属性执行此操作,那么这将是很多代码,但存在输入错误的风险,因此我想执行以下操作:
myQueryableOfMyClass = Filter(myQueryableOfMyClass, begin, end, MyClass.Created);
myQueryableOfMyClass = Filter(myQueryableOfMyClass, changebegin, changeend, MyClass.LastChanged);
myQueryableOfMyClass = Filter(myQueryableOfMyClass, accbegin, accend, MyClass.LastAccessed);
...
与第一个示例一样,Filter
使用LINQ来实现该方法Where
。
上面的代码当然不会编译,因为这MyClass.Created
是胡说八道。
必须有一些使用反射的解决方案,但是我对反射的经验很少。请你帮助我好吗?
您可以使用Func<MyClass, DateTime>
来选择要使用的属性,如下所示:
public static IEnumerable<MyClass> Filter
(
IEnumerable<MyClass> myClasses,
DateTime? begin,
DateTime? end,
Func<MyClass, DateTime> selector
)
{
return myClasses.Where(a => ((begin == null) || (selector(a) >= begin)) && ((end == null) || (selector(a)) <= end));
}
您可以这样称呼它:
Filter(myClasses, begin, end, myClass => myClass.Created);
您将在其中myClass => myClass.Created
使用要使用的属性的选择器替换的位置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句