gpt4 book ai didi

c# - 如何调试 Expression.Lambda? (.net core 2.1 和 .net core 3.1 之间表达式树评估的差异)

转载 作者:行者123 更新时间:2023-12-01 11:02:45 25 4
gpt4 key购买 nike

我创建了一个小程序,显示 .net core 2.1 和 3.1 之间的一些差异:

using System;
using System.Linq.Expressions;
using Microsoft.EntityFrameworkCore.Query;

public class Program
{
public static void Main()
{
var entityObject = Expression.Parameter(typeof(object), "objParam");
var cev = new ExpressionPrinter();
var entObjPrint = cev.PrintDebug(entityObject);
Console.WriteLine(entObjPrint);
}
}

2.1 中的打印输出:未处理的参数:objParam

3.1 中的打印输出:(未处理的参数:objParam){0}

注意最后的括号和额外的 {0}。
有人可以向我解释为什么会有这种差异吗?

注意:这是我的问题的缩短版本,但当我尝试在 .net core 3.1 中编译 Expression.Lambda 时,我收到一个错误(不是异常),这在我的代码的 .net core 2.1 版本中不存在:

{Method = <Internal Error evaluating expression>}



更新 : 好像 PrintDebug实现方式发生了变化。如果您调用 PrintDebug(enitytObject,null,false)将不再有 {0}。

考虑到这一点,也许问题不是那个,但我仍然不知道如何调试 lambda 表达式的编译错误(不要误认为 linq lambda)。

更多关于这个问题 这是我收到错误的代码的一部分:
//return all fields/properties that have an attribute indicating they need to be localized
var locFields = EntityLocalizationReflection.GetLocalizationFields(entityType);
if (locFields?.Count > 0)
{
var updater = new EntityLocalizerUpdater();
// create a parameter representing an object (object)
var entityObject = Expression.Parameter(typeof(object), "objParam");
// convert the parameter to an IEntityType ((object)Category)
var entityInstance = Expression.Convert(entityObject, entityType.Metadata.ClrType);
// iterate over all fields/properties that needs to be localized
foreach (var loc in locFields)
{
// Depending if the localized element is a field or a property, create the expression
var target = loc.Item2.MemberType == MemberTypes.Property
? Expression.Property(entityInstance, (PropertyInfo)loc.Item2)
: Expression.Field(entityInstance, (FieldInfo)loc.Item2);

var getter = Expression.Lambda<Func<object, EntityLocalizer>>(target, entityObject);false);
//getter.Compile() failes only in .NET code 3.1
updater.Add(getter.Compile(), loc.Item1.EntityName);
}

//...some other code..//
}

更新 2:感谢@MarcGravell,这里有一个最低可运行代码: https://gist.github.com/mgravell/57d5691741e1379f32c2d22540acf8da如果在 getter.Compile() 上执行“快速监视”,则可以查看错误。或为其分配一些变量( var compiled = getter.Compile();),然后在调试期间对其进行检查。

最佳答案

在 .net core 3.1 中显示表达式时,这似乎是一个调试器问题。
一个问题已打开。

关于c# - 如何调试 Expression.Lambda? (.net core 2.1 和 .net core 3.1 之间表达式树评估的差异),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61225081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com