Я пытаюсь создать делегат для чтения/записи свойств неизвестного типа класса во время выполнения.
У меня есть общий класс Main<T>
и метод, который выглядит так:
Delegate.CreateDelegate(typeof(Func<T, object>), get)
где get
является MethodInfo
свойства, которое должно быть прочитано. Проблема заключается в том, что когда свойство возвращает int
(я предполагаю, что это происходит для типов значений), вышеуказанный код бросает ArgumentException, потому что метод не может быть связан. В случае строки он работает хорошо.
Чтобы решить проблему, я изменил код так, чтобы соответствующий тип делегата был сгенерирован с помощью MakeGenericType
. Итак, теперь код:
Type func = typeof(Func<,>);
Type generic = func.MakeGenericType(typeof(T), get.ReturnType);
var result = Delegate.CreateDelegate(generic, get)
Теперь проблема заключается в том, что созданный экземпляр делегата generic
, поэтому я должен использовать DynamicInvoke
, который будет таким же медленным, как использование чистого отражения для чтения поля.
Итак, мой вопрос в том, почему первый фрагмент кода не работает с типами значений. Согласно MSDN, он должен работать, поскольку он говорит, что
Тип возврата делегата совместим с типом возвращаемого метода, если возвращаемый тип метода более ограничительный, чем тип возвращаемого значения делегата
и как выполнить делегат во втором фрагменте, чтобы он был быстрее, чем отражение.
Спасибо.