我有:
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'。
答案 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
,但这是一个单独的问题。