2015-09-13 6 views
1

Я был Мессинг с 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. Это происходит только в том случае, если метод имеет параметры, он отлично работает, если у метода нет параметров.

Что я делаю неправильно?

ответ

1

Я думаю, вы получаете параметр «OBJ» ссылка от scopr но не определена ошибка ..

Вот как вы можете это исправить. В вашем методе метода GetMethod ниже строки. Передайте аргумент выражения параметра параметра из метода GetExp.

общественность статическая MethodCallExpression GetMethod (Выражение callingExp, владелец Типа, метод Строки, ParameterExpression пары)

Pass этого параметра expressoin в ниже линии в качестве аргумента

Выражения. Лямбда (результат, пары);

В вашем методе GetMethod ниже строки. Пропустить экземпляр выражения параметра Param, который был создан выше в том же методе.

вар MethodExpression = GetMethod (currentExpression, propType, данные [data.length - 1], экземпляр);

+0

СПАСИБО! Это дало мне всю информацию, которую мне нужно было исправить: D – Morphex

+0

m рад, что я мог бы помочь ........ :) – Viru

Смежные вопросы