Как отладить Expression.Lambda? (Разница в оценке дерева выражений между. net core 2.1 и. net core 3.1) - PullRequest
3 голосов
/ 15 апреля 2020

Я создал небольшую программу, которая показывает некоторые различия между net ядром 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

the распечатайте в 3.1: (необработанный параметр: objParam) {0}

обратите внимание на квадратные скобки и дополнительные {0} в конце. Может кто-нибудь объяснить мне, почему это различие?

ПРИМЕЧАНИЕ. Это сокращенная версия моей проблемы, но также и при попытке скомпилировать Expression.Lambda в. net core 3.1 Я получаю сообщение об ошибке ( не исключение), которого нет в. net версии ядра 2.1 моего кода:

{Method = <Internal Error evaluating expression>}

ОБНОВЛЕНИЕ : Это Кажется, что реализация PrintDebug изменилась. Если вы позвоните PrintDebug(enitytObject,null,false), то больше не будет {0}.

Имея это в виду, возможно, проблема не в этом, но все же я не знаю, как отладить ошибку компиляции лямбда-выражения ( не путать с 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();), а затем проверить его во время отладки.

1 Ответ

0 голосов
/ 16 апреля 2020

Кажется, что это проблема отладчика при отображении выражений в. net core 3.1. Проблема была открыта.

...