C#接口IEnumerable Any(),不指定泛型类型

Ila*_*het 1 c# linq ienumerable

我已经铸造了

var info = property.Info;
object data = info.GetValue(obj);

...

var enumerable = (IEnumerable)data;

if (enumerable.Any())  ///Does not compile
{
}

if (enumerable.GetEnumerator().Current != null) // Run time error
{
}
Run Code Online (Sandbox Code Playgroud)

并且我想通过使用Linq Query Any()来查看此枚举是否具有任何元素.但不幸的是,即使使用Linq,我也做不到.

如何在不指定泛型类型的情况下执行此操作.

Jon*_*eet 12

虽然你不能直接这样做,你可以通过以下方式完成Cast:

if (enumerable.Cast<object>().Any())
Run Code Online (Sandbox Code Playgroud)

这应该总是有效,因为任何IEnumerable可以包装为IEnumerable<object>.如果它实际上是一个IEnumerable<int>或类似的话,它将最终装箱第一个元素,但它应该工作正常.不像大多数LINQ方法CastOfType目标IEnumerable,而不是IEnumerable<T>.

您可以编写自己的扩展方法子集,如LINQ,但是IEnumerable如果您愿意,可以在非泛型类型上运行.实现LINQ to Objects并不是非常困难 - 例如,您可以使用我的Edulinq项目作为起点.

在某些情况下,您可以Any(IEnumerable)比使用更有效地实现Cast- 例如,如果目标实现非泛型ICollection接口,则采用快捷方式.此时,您不需要创建迭代器或获取第一个元素.在大多数情况下,不会产生太大的性能差异,但如果您进行优化,这是您可以做的事情.