转换为 IEnumerable

Mat*_*ing 1 c#

我有一段相当长的代码,用于计算列表中将其属性之一设置为特定值的对象的数量。然而,我上面提到的几乎所有内容都会在运行时传递,留给我的是:

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

问题在于该列表作为对象存储在 Datasource 属性中。为了使用 count,目前我必须将此对象转换为 MyObject 类型的列表。我希望能够在数据源中存储任何类型的 IEnumerable 。我知道存储在 Datasource 中的对象始终是一个 List,但我很难让 C# 相信这一事实。它一直抱怨类型安全。

我使用的是 .Net 3.5,因此由于协变/逆变,向上转换为 List<Object> 在运行时会失败(我永远记不起哪个是哪个)。我同样无法转换为 IEnumerable。有没有办法让这段代码与任何类型的 IEnumerable 一起工作?

Sve*_*ven 5

这个怎么样:

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

Enumerable.Cast是少数适用于非泛型的扩展方法之一IEnumerable。它返回一个,IEnumerable<T>之后您可以使用其他扩展方法,例如Enumerable.Count.