我将首先展示我的代码:
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子句有什么问题?
非常感谢您的回答
答案 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();
感谢您的时间和答案。