C# 呼叫表达式
我有:C# 呼叫表达式,c#,linq,expression,C#,Linq,Expression,我有: X类 { Y类 { 公共Y跳过(整数计数) { var mi=(MethodInfo)MethodBase.GetCurrentMethod(); var f=Expression.Call(null,mi,Expression.Constant(count)); var x=this.Provider.CreateQuery(f); 归还其他东西; } } } 我得到Y`1 Skip(Int32)包含泛型参数 无法使该方法成为泛型,因此我可以调用method.MakeGenericT
X类
{
Y类
{
公共Y跳过(整数计数)
{
var mi=(MethodInfo)MethodBase.GetCurrentMethod();
var f=Expression.Call(null,mi,Expression.Constant(count));
var x=this.Provider.CreateQuery(f);
归还其他东西;
}
}
}
我得到Y`1 Skip(Int32)包含泛型参数
无法使该方法成为泛型,因此我可以调用method.MakeGenericType
你知道我如何创建表达式吗
我还尝试:
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;
}
}
}
var f=Expression.Call(typeof(Y),“Skip”,新类型[]{gt},Expression.Constant(count));
这次我得到:
类型“X1+Y
1[t1,t2]”上不存在方法“Skip”。这似乎有效:
var f = Expression.Call(typeof(Y<>), "Skip", new Type[] { gt }, Expression.Constant(count));
顺便说一下,Type.EmptyTypes
相当于新类型[0]
这似乎有效:
var f = Expression.Call(typeof(Y<>), "Skip", new Type[] { gt }, Expression.Constant(count));
顺便说一句,Type.EmptyTypes
相当于新类型[0]
,如所述,GetCurrentMethod不填充拥有当前方法的类型的泛型参数
相反,一个选项是使用:
var f = Expression.Call(
Expression.Constant(this),
"Skip",
Type.EmptyTypes,
Expression.Constant(count));
MethodInfo mi=typeof(X.Y).GetMethod(“跳过”);
表达式f=表达式.Call(null,mi,表达式.Constant(count))
另外,第一个参数不应该是null
,但这是一个单独的问题。如所述,GetCurrentMethod不填充拥有当前方法的类型的泛型参数
相反,一个选项是使用:
var f = Expression.Call(
Expression.Constant(this),
"Skip",
Type.EmptyTypes,
Expression.Constant(count));
MethodInfo mi=typeof(X.Y).GetMethod(“跳过”);
表达式f=表达式.Call(null,mi,表达式.Constant(count))
另外,第一个参数不应该是
null
,但这是一个单独的问题。你能把它放到一个工作示例中吗?你能把它放到一个工作示例中吗?