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