我一直在搞乱表达树,我遇到了挫折,无法找到原因或如何解决这个问题:
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调用中调用Compile时,我从Scope中获取了一个Argument。只有当方法有参数时才会发生这种情况,如果方法没有参数,它就可以正常工作。
我做错了什么?