C # null условный оператор ?.
был бы очень полезен в этом случае. К сожалению, он все еще не поддерживается в деревьях выражений, поэтому один из способов достижения цели - динамически создать эквивалент ручных нулевых проверок в будущем:
x => x != null && x.Prop1 != null && x.Prop1.Prop2 != null ... ? (object)x.Prop1.Prop2...PropN : null
Поскольку вам нужно было бы агрегировать как выражение доступа к члену, так и условие для использования в конечном Expression.Condition
, метод Aggregate
не годится - выполнение агрегации со старым добрым циклом foreach
выглядит более подходящим, например, вот так:
var parameter = Expression.Parameter(typeof(T));
var nullConst = Expression.Constant(null);
Expression source = parameter, condition = null;
foreach (var memberName in expressionString.Split('.'))
{
var notNull = Expression.NotEqual(source, nullConst);
condition = condition != null ? Expression.AndAlso(condition, notNull) : notNull;
source = Expression.PropertyOrField(source, memberName);
}
source = Expression.Convert(source, typeof(object));
var body = Expression.Condition(condition, source, nullConst);
return Expression.Lambda<Func<T, object>>(body, parameter)
.Compile();