C# Expression.Compile(),参数超出范围
我一直在搞乱表达式树,我遇到了挫折,找不到为什么或如何解决这个问题:C# Expression.Compile(),参数超出范围,c#,delegates,expression-trees,C#,Delegates,Expression Trees,我一直在搞乱表达式树,我遇到了挫折,找不到为什么或如何解决这个问题: public static Expression GetExp(object caller, string s) { var callerType = caller.GetType(); if (s.Contains('(')) { //We are a method call var data = s.Sp
public static Expression GetExp(object caller, string s)
{
var callerType = caller.GetType();
if (s.Contains('('))
{
//We are a method call
var data = s.Split('.');
var instance = Expression.Parameter(callerType, "obj");
var currentExpression = (Expression)instance;
for (int index = 0; index < data.Length - 1; index++)
{
var prop = data[index];
currentExpression = (Expression.PropertyOrField(currentExpression, prop));
}
var expLex = Expression.Lambda(currentExpression, instance);
var compiled = expLex.Compile();
var result = compiled.DynamicInvoke(caller);
var propType = result.GetType();
var propField = Expression.Parameter(propType, "prop");
var methodExpression = GetMethod(currentExpression,propType, data[data.Length - 1]);
//What now?
var fullExp = Expression.Lambda(methodExpression,instance);
var fullcompiled = fullExp.Compile();
var final =fullcompiled.DynamicInvoke(caller);
}
return null;
}
public static MethodCallExpression GetMethod(Expression callingExp,Type owner, string method)
{
//parameters = null
var start = method.IndexOf('(');
var end = method.LastIndexOf(')');
string methodName = method.Substring(0, start);
var amount = end - start; ;
var methodInfo = owner.GetMethod(methodName,BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
if (amount <= 1)
{
return Expression.Call(callingExp, methodInfo);
}
var parameters = methodInfo.GetParameters().Select(v => Expression.Parameter(v.ParameterType, v.Name)).Cast<Expression>().ToList();
var ara = parameters.Cast<ParameterExpression>().ToArray();
var result = Expression.Call(callingExp, methodInfo, Expression.Parameter(typeof(int),"something"));
var fullExp = Expression.Lambda(result);
var c = fullExp.Compile();
return result;
}
公共静态表达式GetExp(对象调用方,字符串s)
{
var callerType=caller.GetType();
如果(s)包含(“(”)
{
//我们是一个方法调用
var数据=s.Split('.');
var instance=Expression.Parameter(callerType,“obj”);
var currentExpression=(表达式)实例;
for(int index=0;index
基本上,当我在GetMethod调用中调用Compile时,我得到了一个超出范围的参数。这只发生在方法有参数的情况下,如果方法没有参数,它工作得非常好
我做错了什么?我猜您得到的参数“obj”是从scopr引用的,但它不是定义的错误 以下是您可以修复它的方法。 在GetMethod方法中,在第行下面更改。从GetExp方法传递参数表达式参数 公共静态方法调用表达式GetMethod(表达式 callingExp,类型所有者,字符串方法,ParameterExpression 参数) 将此参数表达式作为参数传入下一行 表达式Lambda(结果,参数) 在GetMethod中,在第行下面更改。传递参数表达式实例,该实例是在同一方法中创建的 var methodExpression=GetMethod(currentExpression,propType, data[data.Length-1],实例)
谢谢!这给了我修复它所需的所有信息:D