Самый простой способ преобразовать выражение доступа к свойству в другое, которое возвращает более базовый тип? - PullRequest
0 голосов
/ 09 января 2012

У меня есть метод, похожий на

ISomething<U> Foo<T, U>(Expression<Func<T, U>> selector)
{
    Expression<Func<T, object>> generalSelector =
         ChangeSelectorReturnType<object>(selector);
    Use(generalSelector);
    return new Something<U>(selector);
}

Какой самый простой код для реализации ChangeSelectorReturnType при условии, что selector всегда будет простым средством доступа к свойствам, таким как x => x.Property?

Я знаю, что решение , представленное в другом вопросе , работает, но оно требует посетителя с полным выражением, потому что никаких предположений не делается.Я в порядке с предположениями в этом случае.

1 Ответ

0 голосов
/ 09 января 2012

Используйте выражение Convert() на теле лямбды.Это позволит вам изменить его тип.Затем воссоздайте лямбду.

var modifiedBody = Expression.Convert(selector.Body, typeof(object));
var generalSelector =
    Expression.Lambda<Func<T, object>>(modifiedBody, selector.Parameters);
...