强制转换为IEnumerable

本文关键字:IEnumerable 转换 | 更新日期: 2023-09-27 18:03:49

我有一段相当长的代码,用于计算列表中有一个属性被设置为某个值的对象的数量。然而,我上面提到的几乎所有内容都是在运行时传入的,这就给我留下了这样的内容:

((List<MyObject>)this.DataSource).Count(d => d.GetType().GetProperty(MyProperty).GetValue(d, null).ToString() == ValueToMatch);

问题是该列表作为一个对象存储在Datasource属性中。为了使用count,目前我必须将这个对象强制转换为MyObject类型的列表。我想能够存储任何类型的IEnumerable在数据源。我知道存储在Datasource中的对象将永远是一个List,但是我很难说服c#相信这个事实。它总是抱怨类型安全。

我是在。net 3.5中,所以向上转换为List在运行时由于co/逆变而失败(我永远记不住哪个是哪个)。同样,我也不能强制转换为IEnumerable。有没有办法使这段代码与任何类型的IEnumerable一起工作?

强制转换为IEnumerable

这个怎么样:

((IEnumerable)this.DataSource).Cast<object>().Count(d => d.GetType().GetProperty(MyProperty).GetValue(d, null).ToString() == ValueToMatch);

Enumerable.Cast是为数不多的可以在非泛型IEnumerable上工作的扩展方法之一。它返回一个IEnumerable<T>,之后您可以使用其他扩展方法,如Enumerable.Count

((IEnumerable)DataSource).Cast<object>()不行吗?

相关文章: