Re[4]: Построение предиката через Expression tree
От: rFLY  
Дата: 12.03.23 20:38
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Expression.Constant нормально

Я почему спросил. Когда при помощи Expression.DebugView вывел законченное выражение и сравнил его с выражением предиката, то получил:
var debugView = typeof(Expression).GetProperty("DebugView", BindingFlags.Instance | BindingFlags.NonPublic);

// Expression
var recordExpression = Expression.Parameter(typeof(Record), "record");
var expr2 = Expression.Lambda<Func<Record, bool>>(Expression.Call(typeof(object), "ReferenceEquals", null, new Expression[] {
    Expression.Field(recordExpression, "f2"),
    Expression.Field(Expression.Constant(recordList.currentRecord), "f2")
}), recordExpression);
// Вывод в консоль
.Lambda #Lambda1<System.Func`2[ConsoleApp.Record,System.Boolean]>(ConsoleApp.Record $record) {
    .Call System.Object.ReferenceEquals(
        $record.f2,
        .Constant<ConsoleApp.Record>(#4: 1, 2, 4).f2)
}

// Предикат
Expression<Func<Record, bool>> expr1 = record => ReferenceEquals(record.f2, recordList.currentRecord.f2);
Console.WriteLine(debugView.GetValue(expr1));
// Вывод в консоль
.Lambda #Lambda1<System.Func`2[ConsoleApp.Record,System.Boolean]>(ConsoleApp.Record $record) {
    .Call System.Object.ReferenceEquals(
        $record.f2,
        ((.Constant<ConsoleApp.Program+<>c__DisplayClass1_0>(ConsoleApp.Program+<>c__DisplayClass1_0).recordList).currentRecord).f2)
}

Последние строки отличаются, причем в случае с Expression так же показывается результат переопределенной ToString()

Вот тут можно запустить и посмотреть
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.