Почему IEnumerable.Aggregate принимает Expression
и MemberExpression
?
Второй аргумент, передаваемый Aggregate
, равен , а не a MemberExpression
!Смотри внимательно!
Expression.PropertyOrField
не является собственностью.Это метод.Поскольку в конце нет скобок, вы не называете это.Expression.PropertyOrField
представляет здесь группу методов.
Expression.PropertyOrField
принимает Expression
и string
и возвращает MemberExpression
, поэтому он может быть представлен типом делегата Func<Expression, string, MemberExpression>
.И первый аргумент имеет тип Expression
, поэтому вы, по сути, звоните:
Aggregate(Expression, Func<Expression, string, MemberExpression>)
Это соответствует сигнатуре этой перегрузки из Aggregate
:
public static TAccumulate Aggregate<TSource,TAccumulate> (
this System.Collections.Generic.IEnumerable<TSource> source,
TAccumulate seed,
Func<TAccumulate,TSource,TAccumulate> func);
TAccumulate
это Expression
и TSource
это string
.
Что касается того, что эта линия делает на высоком уровне, я уверен, что вы выяснилисейчас.Он преобразует строку memberPath
, которая может выглядеть примерно так:
w.x.y.z
в Expression
объект, представляющий это выражение.