调用第一个LINQ方法

时间:2015-02-03 20:04:01

标签: vb.net linq expression-trees

我有这个:

Dim aggregator_func As MethodInfo = Nothing
aggregator_func = GetType(Enumerable).GetMethods(BindingFlags.Public Or BindingFlags.Static).
    Where(Function(m) m.Name = "First").Where(Function(m) m.ReturnType.FullName = "")(0).MakeGenericMethod(GetType(Object))
Dim groupparameter = Expression.Parameter(GetType(Linq.IGrouping(Of Object(), Object())), "g")
Dim aggregation As Expression

我想称之为:g.First()(0)

g.First返回一个对象数组,但我只需要指定索引处的对象(在本例中为0)。我可以很容易地为索引提供常量,但是我怎么能调用上面的表达式?

我用Google搜索,但发现对我没用。

这应该是某种方式的补充:

aggregation = Expression.Call(aggregator_func, groupparameter)

感谢。

修改

g参数是Linq.IGrouping(Of Object(), Object())。那'为什么First返回一个对象数组。也许,一组对象也可以被称为对象,但我认为,现在这并不重要。

1 个答案:

答案 0 :(得分:0)

正如here所解释的那样,像Enumerable.First这样的静态方法需要将一个null实例作为第一个参数传递。您还需要正确构造通用方法First。如果不这样做,编译器将不会将聚合类型识别为Object(),而是将其视为Object,并且不会编译

只有更改的行是aggregator_func行,最后两行添加。

    Dim aggregator_func As MethodInfo = Nothing
    aggregator_func = GetType(Enumerable).GetMethods(BindingFlags.Public Or BindingFlags.Static).
        Where(Function(m) m.Name = "First").Where(Function(m) m.ReturnType.FullName = "")(0).MakeGenericMethod(GetType(Object()))
    Dim groupparameter = Expression.Parameter(GetType(Linq.IGrouping(Of Object(), Object())), "g")
    Dim aggregation As Expression = Expression.Call(Nothing, aggregator_func, groupparameter)
    Dim arrayAccess As Expression = Expression.ArrayAccess(aggregation, Expression.Constant(0))