Почему это работает для строк или других классов, но не для Int или DateTime?
Поскольку метод, который возвращает int
, не является методом, который возвращает ссылку object
. Должно быть преобразование в бокс - поэтому что-то должно быть сделано, и Delegate.CreateDelegate
пытается предоставить делегат, который просто вызывает делегат и возвращает результат, без преобразования значения.
Это немного больно, но, в принципе, я подозреваю, что вам следует либо создать Func
с соответствующим возвращаемым значением и, используя это или , вы должны пройти через оболочку. делегат, который вызывает «реальный» делегат и упаковывает результат.
(Обратите внимание, что в вашем примере кода вы создаете делегата каждый раз, что будет не быстрее, чем отражение. Надеюсь, ваш реальный код более разумен:)
Если вы посмотрите на этот код из protobuf-csharp-port
, вы увидите, что у меня есть метод, который делает именно это - лямбда-выражение вызывает строго типизированный делегат, а затем использует неявное преобразование на object
(бокс при необходимости), чтобы указать значение. Вы должны быть в состоянии использовать что-то очень похожее. Однако, если вы сортируете, вы действительно хотите a Func<T, object>
? Если вместо этого вы используете строго типизированный делегат, вы можете избежать всего этого бокса.