Я был Мессинг с Expression Trees, и я ударил удар и не может найти, почему и как исправить это:Expression.Compile(), параметр выходит за рамки
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;
}
Основном Я получаю Аргумент вне области действия, когда я вызываю компиляцию в вызове GetMethod. Это происходит только в том случае, если метод имеет параметры, он отлично работает, если у метода нет параметров.
Что я делаю неправильно?
СПАСИБО! Это дало мне всю информацию, которую мне нужно было исправить: D – Morphex
m рад, что я мог бы помочь ........ :) – Viru