Здравствуйте, Ночной Смотрящий, Вы писали:
НС>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()
Вот
тут можно запустить и посмотреть