1

我可以找到一个项目是否存在于正常列表中,如下所示:

Dim x as new list(of string)
dim result = x.any(function (y) y.length > 4)

根据是否有超过 4 个字符的项目返回 true 或 false。

但是,如果我这样做:

dim e as object = new expandoobject
dim x as new list(of string)
e.items = x

dim result = e.items.any(function (y) y.length > 4)

产生一条错误消息,说明 any 不是 List 的扩展方法。

谁能告诉我为什么会发生这种情况以及我是否可以将列表分配给 expandoobject 然后使用扩展方法。

谢谢

4

2 回答 2

0

因为扩展方法只是语法糖。实际上,当你说

暗淡的结果 = items.any(Function(y) y.length > 4)

您实际上是在System.Linq.Enumerable类上调用静态方法,如下所示:

暗淡结果 = Enumerable.Any(e.items, Function(y) y.length > 4)

这是由编译器自动为您翻译的。不幸的是,因为您使用的是动态对象,编译器无法推断您正在尝试调用扩展方法,因为它不知道length属性的类型。因此,它被解释Any()为一个实例方法,这会导致它在运行时失败,因为这种方法实际上并不存在。

即使您将其更改为使用上面的显式语法,它也不会正确编译,因为它仍然不知道 e.items 的类型。因此,您需要对其进行投射。

Dim result = Enumerable.Any((CType(e.items, List(Of String))), Function(y) y.Length > 4)

更好的主意是尽可能避免使用 ExandoObject。Linq 旨在对静态类型的对象执行查询。

于 2013-01-11T20:51:25.143 回答
0

你可以这样做,但你必须转换e.items为正确的类型:

dim result = DirectCast(e.items, List(of String)).any(function (y) y.length > 4)
于 2013-01-11T20:53:18.377 回答