使用反射在谓词中引用类的属性

伏塔

我有一个具有许多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是胡说八道。

必须有一些使用反射的解决方案,但是我对反射的经验很少。请你帮助我好吗?

马修·沃森(Matthew Watson)

您可以使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章