2013-12-23 3 views
2

Как упомянуто в названии У меня есть выражение, где тип результата «хранящийся» в object, который может быть все моих классов предметной области. Есть ли способ получить конкретное выражение (unboxing)?Generic распаковка выражения <Func <T, object>> в Expression <Func <T, TResult>>

+0

Какие выражения могут быть использованы в теле лямбда-в? – Dennis

ответ

3

Если я правильно понял ваш вопрос, что вы могли бы искать в Expression.Convert

Expression<Func<T,object>> original = // ... something 
Expression<Func<T,TResult>> converted = Expression.Lambda<Func<T,TResult>>(
     Expression.Convert(original.Body,typeof(TResult)), 
     original.Parameters); 

Demo on ideone.

+0

Спасибо, это работает! Но еще один вопрос: когда мне нужно это unboxed выражение, я не знаю тип TResult (кроме того, что реализует IPersistable). Я мог запомнить/получить тип и упаковать вызов 'Unbox (f1)' в выражении case switch. Но знаете ли вы более удобный способ? – core

+0

Как бы вы хотели получить Func , если вы не знаете, что такое TResult? У вас есть хотя бы объект System.Type, представляющий TResult? – Olivier

+0

Чтобы получить или удерживать тип, это не проблема. Но может ли этот вопрос быть полезен для новой темы? – core

Смежные вопросы