Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Expression.Compile(),参数超出范围_C#_Delegates_Expression Trees - Fatal编程技术网

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