将name调用的属性与where子句lambda表达式中的类型T进行比较

时间:2015-03-09 14:52:31

标签: c# reflection lambda

我将首先展示我的代码:

public IEnumerable<MessageSummary> GetMessagesBy<T>(string propertyName, T parameter)
{
            tempMessages = mylist.Where(x => EqualityComparer<T>.Default.Equals((T) (x.GetType().GetProperty(propertyName).GetValue(x, null)), parameter)).ToList();
...
}

我想获取mylist中的对象列表,具体取决于作为参数给出的属性,并将其与变量类型的对象进行比较。 它打破了这一行,说在where子句中存在问题。

但是,如果我这样做:

    if (EqualityComparer<T>.Default.Equals((T)mylist.First().GetType().GetProperty(propertyName).GetValue(mylist.First(), null), parameter))
{ ... }

效果很好......

我的where子句有什么问题?

非常感谢您的回答

2 个答案:

答案 0 :(得分:0)

如果发生这种情况,那么您的方法的泛型参数是列表中项目的派生类型较少,在这种情况下,列表中项目的实际类型具有相关属性,但无论何种类型因为泛型参数没有传递,或者列表中的所有项都不能隐式转换为作为泛型参数传递的类型,因此转换本身就失败了。

解决方案是确保传递给方法的泛型参数实际上是适当的类型。或者,就此而言,由于您已经拥有List,因此您可能不应该首先使GetMessagesBy成为通用的,因为您已经知道{{的通用参数是什么1}} 实际上是。

答案 1 :(得分:0)

问题在于迭代。我的列表是IQueryable类型(忘了注意它......),当我尝试访问第二项(例如)时:mylist.elementAt(1);它失败了。

我刚刚添加了一个.ToList(),现在它可以工作......

tempMessages = mylist.ToList().Where(x => EqualityComparer<T>.Default.Equals((T) (x.GetType().GetProperty(propertyName).GetValue(x, null)), parameter)).ToList();

感谢您的时间和答案。