Выделение результата Expression.Property

c# expression-trees reflection

Вопрос

Как создать приведение при создании дерева Expression динамически?

Проблема в том, что у меня есть свойство типа string :

public class Test
{
    public string Id { get; set; }
}

И я хочу создать строго типизированное лямбда-выражение, представляющее делегат, который возвращает object вместо string ( Expression<Func<T, object>> ).

Сейчас я делаю это:

private static Expression<Func<T, object>> CreateIdQuery()
{
    Type type = typeof(T);
    PropertyInfo idProperty = type.GetProperty("Id");
    ParameterExpression lambdaParam = Expression.Parameter(type, "x");
    MemberExpression body = Expression.Property(lambdaParam, idProperty);
    LambdaExpression expr = Expression.Lambda(body, lambdaParam);
    return (Expression<Func<T, object>>)expr;
}

Но он вызывает исключение в последней строке (я не могу использовать Expression<Func<Test, string>> для Expression<Func<Test, object>> ).

Как я могу выразить тело выражения (я предполагаю, что часть MemberExpression нужно MemberExpression в object )?

Принятый ответ

Используйте Expression.Convert(body, typeof(object)) .

private static Expression<Func<T, object>> CreateIdQuery()
{
    Type type = typeof(T);
    PropertyInfo idProperty = type.GetProperty("Id");
    ParameterExpression lambdaParam = Expression.Parameter(type, "x");
    MemberExpression body = Expression.Property(lambdaParam, idProperty);
    UnaryExpression converted = Expression.Convert(body, typeof(object));
    LambdaExpression expr = Expression.Lambda(converted, lambdaParam);
    return (Expression<Func<T, object>>)expr;
}


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему