Я пытаюсь создать делегат для чтения / записи свойств неизвестного типа класса во время выполнения.
У меня есть универсальный класс 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 он должен работать так, как говорится, что
Тип возврата делегата совместим с типом возврата метода, если тип возврата метода более ограничительныйчем возвращаемый тип делегата
и как выполнить делегат во втором фрагменте, чтобы он быстрее, чем отражение.
Спасибо.