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