Выражения свойств требуют, чтобы доступ к свойству находился на определенном объекте. Здесь вы можете выбрать несколько вариантов. Во-первых, если это делается внутри одного из ваших объектов сущности, вы можете просто использовать ConstantExpression для построения выражения свойства:
// Already have PropertyInfo in propInfo
Expression.Property(Expression.Constant(this, this.GetType()), propInfo)
Однако, поскольку вам нужен Expression<Func<TStructuralType, TProperty>>
, похоже, что вам нужно будет построить его с помощью ParameterExpression:
ParameterExpression pe = Parameter.Expression(typeof(MyEntity), "eParam");
Expression propExp = Expression.Property(pe, propInfo);
ОДНАКО, вот кикер ... Это просто выражение члена. Чтобы преобразовать в нужное вам выражение, вам нужно использовать Expression.Lambda
, чтобы получить Func <> выражение нужного вам типа. Эта проблема? Вы не знаете тип свойства для определения общих параметров лямбда-выражения!
Expression<Func<MyEntity, ????>> eFunc = Expression.Lambda<Func<MyEntity, ????>>(propExp, pe);
В этом суть проблемы сделать это таким образом. Это не значит, что этого нельзя сделать ... Просто использование этого метода В ЭТОМ СПОСОБЕ не сработает. Вам нужно будет использовать немного хитрости во время выполнения и статической типизации (а также разумное использование Actions вместо Funcs), чтобы заставить это работать правильно.