我有这个:
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
返回一个对象数组。也许,一组对象也可以被称为对象,但我认为,现在这并不重要。
答案 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))