Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.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# 计算动态生成的表达式树时出现NullReferenceException_C#_.net_Nhibernate_Linq Expressions - Fatal编程技术网

C# 计算动态生成的表达式树时出现NullReferenceException

C# 计算动态生成的表达式树时出现NullReferenceException,c#,.net,nhibernate,linq-expressions,C#,.net,Nhibernate,Linq Expressions,我正在构建此表达式树: .Lambda #Lambda1<System.Func`2[RTX.Ulysses.TestFramework.TestCaseDataResult, System.Collections.Generic.Dictionary`2[System.String,System.Object]]> (RTX.Ulysses.TestFramework.TestCaseDataResult $x) { .Block( System.Collections.

我正在构建此表达式树:

.Lambda 
#Lambda1<System.Func`2[RTX.Ulysses.TestFramework.TestCaseDataResult,
System.Collections.Generic.Dictionary`2[System.String,System.Object]]>
(RTX.Ulysses.TestFramework.TestCaseDataResult $x)
{
.Block(
    System.Collections.Generic.Dictionary`2[System.String,System.Object] $dict,
    RTX.Ulysses.TestFramework.TestCaseDataResult $x) {
    .Block(
        System.Collections.Generic.Dictionary`2[System.String,System.Object] $dict,
        RTX.Ulysses.TestFramework.TestCaseDataResult $x) {
        $dict = .New 
System.Collections.Generic.Dictionary`2[System.String,System.Object]();
        .Call $dict.Add(
            "Id",
            (System.Object)$x.Id)
    };
    $dict
  }
}
.Lambda
#Lambda1
(RTX.Ulysses.TestFramework.TestCaseDataResult$x)
{
.街区(
System.Collections.Generic.Dictionary`2[System.String,System.Object]$dict,
RTX.Ulysses.TestFramework.TestCaseDataResult$x){
.街区(
System.Collections.Generic.Dictionary`2[System.String,System.Object]$dict,
RTX.Ulysses.TestFramework.TestCaseDataResult$x){
$dict=.New
System.Collections.Generic.Dictionary`2[System.String,System.Object]();
。请致电$dict.Add(
“身份证”,
(系统对象)$x.Id)
};
$dict
}
}
使用此代码:

 _parameterExpression = Expression.Parameter(typeof(TestCaseDataResult), "x");
 // Init
        //Expression valExpression = Expression.Property(parameter, "Length");
        ParameterExpression dictVar = Expression.Variable(typeof(Dictionary<string, object>), "dict");
        Expression newDict = Expression.New(typeof(Dictionary<string, object>).GetConstructors()[0]);
        Expression builtExpression = Expression.Assign(dictVar, newDict);

        // Adding a value
        List<Expression> calls = new List<Expression>();
        calls.Add(builtExpression); // Add variable initialization.
        foreach (var fieldPath in dictionaryToBuild)
        {
            Expression valExpression = BuildLambda(fieldPath);
            calls.Add(Expression.Call(dictVar, typeof (Dictionary<string, object>).GetMethod("Add"),
                                      Expression.Constant(fieldPath),
                                      Expression.Convert(valExpression, typeof (object))));
        }

        builtExpression = Expression.Block(new List<ParameterExpression>() { dictVar, _parameterExpression }, calls); // dictVar, _parameterExpression
        builtExpression = Expression.Block(typeof(Dictionary<string, object>), new List<ParameterExpression>() { dictVar, _parameterExpression }, builtExpression, dictVar);

        Expression<Func<TestCaseDataResult, Dictionary<string, object>>> finalExpression = Expression.Lambda<Func<TestCaseDataResult, Dictionary<string, object>>>(builtExpression, _parameterExpression);

        return finalExpression;

public Expression BuildLambda(string expressionString)
    {
        Expression builtExpression = _parameterExpression;
        foreach (var part in expressionString.Split('.'))
        {
            builtExpression = Expression.Property(builtExpression, part);
        }

        return builtExpression;
    }
\u参数Expression=Expression.Parameter(typeof(TestCaseDataResult),“x”);
//初始化
//表达式valExpression=Expression.Property(参数“Length”);
ParameterExpression dictVar=Expression.Variable(typeof(Dictionary),“dict”);
表达式newDict=Expression.New(typeof(Dictionary).GetConstructors()[0]);
Expression builexpression=Expression.Assign(dictVar,newDict);
//增值
列表调用=新列表();
calls.Add(buildexpression);//添加变量初始化。
foreach(构建中的var字段路径)
{
表达式valExpression=BuildLambda(fieldPath);
calls.Add(Expression.Call(dictVar,typeof(Dictionary).GetMethod(“Add”),
表达式.常量(字段路径),
Convert(valExpression,typeof(object));
}
builtExpression=Expression.Block(new List(){dictVar,_parameterExpression},calls);//dictVar,_参数表达式
builtExpression=Expression.Block(typeof(Dictionary),new List(){dictVar,_parameterExpression},builtExpression,dictVar);
Expression finalExpression=Expression.Lambda(内置表达式,_参数表达式);
返回最终压力;
公共表达式BuildLambda(字符串表达式字符串)
{
表达式builtExpression=\u参数表达式;
foreach(表达式字符串拆分('.')中的变量部分)
{
builtExpression=Expression.Property(builtExpression,part);
}
返回buildexpression;
}

但我在计算时收到NullReferenceException。有人能帮忙吗?

找到了问题。这个表达式似乎工作得很好——这就是行为错误的评估者。我正在将生成的表达式传递给NHibernate,它无法从此表达式生成sql

似乎
Dictionary(){{“key”,“value”}}
var dict=newdictionary()不同;添加(“键”、“值”);返回dict
。当我将表达式转换为第一个变量时,它起了作用,现在我能够构造到NHibernate的动态查询

我正在向感兴趣的人介绍一个示例生成器:

// Init 
        NewExpression newDict = Expression.New(typeof(Dictionary<string, object>));

        // Adding a value
        List<ElementInit> elements = new List<ElementInit>();

        System.Reflection.MethodInfo addMethod = typeof(Dictionary<string, object>).GetMethod("Add");
        foreach (var fieldPath in dictionaryToBuild)
        {
            Expression valExpression = BuildLambda(fieldPath);
            elements.Add(Expression.ElementInit(addMethod, Expression.Constant(fieldPath), Expression.Convert(valExpression, typeof(object))));
        }

        var listInitExpression = Expression.ListInit(newDict, elements);

        Expression<Func<TestCaseDataResult, Dictionary<string, object>>> finalExpression = Expression.Lambda<Func<TestCaseDataResult, Dictionary<string, object>>>(listInitExpression, _parameterExpression);

        return finalExpression;
//初始化
NewExpression newDict=Expression.New(typeof(Dictionary));
//增值
列表元素=新列表();
System.Reflection.MethodInfo addMethod=typeof(Dictionary.GetMethod(“Add”);
foreach(构建中的var字段路径)
{
表达式valExpression=BuildLambda(fieldPath);
Add(Expression.ElementInit(addMethod,Expression.Constant(fieldPath),Expression.Convert(valExpression,typeof(object)));
}
var listInitExpression=Expression.ListInit(newDict,elements);
Expression finalExpression=Expression.Lambda(listInitExpression,_parameterExpression);
返回最终压力;

分析堆栈跟踪,看看问题出在哪里。@AlvinWong它什么也没说。这是它的一部分:在Remotion.Linq.Parsing.ExpressionTreeVisitors.PartialEvaluationExpressionTreeVisitor.EvaluateSubtree(表达式子树)在Remotion.Linq.Parsing.ExpressionTreeVisitors.PartialEvaluationExpressionTreeVisitor.VisitePression(表达式表达式)在Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitLambDaeExpression(lambdaeExpression表达式)在Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitePression(表达式表达式)在。。。