调用Expression.Call

时间:2013-04-03 02:12:51

标签: c# linq expression

我有:

class X<t1>
{
   class Y<t2>
   {

      public Y<t2> Skip(int count)
      {
          var mi = (MethodInfo)MethodBase.GetCurrentMethod();
          var f = Expression.Call(null, mi,Expression.Constant(count));
          var x = this.Provider.CreateQuery(f);
          return something_else;
      }
   }
}

我得到Y`1 Skip(Int32)包含通用参数。

不能使方法通用,所以我可以调用method.MakeGenericType

关于如何创建Expression.Call的任何想法?

我也尝试过:

var f = Expression.Call(typeof(Y<>), "Skip", new Type[] { gt }, Expression.Constant(count));

这次我得到:

类型'X 1+Y 1 [t1,t2]'上没有方法'Skip'。

2 个答案:

答案 0 :(得分:1)

这似乎有效:

var f = Expression.Call(
     Expression.Constant(this), 
     "Skip", 
     Type.EmptyTypes, 
     Expression.Constant(count));

顺便说一下,Type.EmptyTypes相当于new Type[0]

答案 1 :(得分:0)

the documentation所述,GetCurrentMethod不会填写拥有当前方法的类型的泛型参数。

相反,选项是使用:

MethodInfo mi = typeof(X<t1>.Y<t2>).GetMethod("Skip");
Expression f = Expression.Call(null, mi, Expression.Constant(count))

此外,第一个参数不应该是null,但这是一个单独的问题。