#c# #.net #dynamic-language-runtime #dynamicobject #tryinvokemember
#c# #.net #dynamic-language-runtime #dynamicobject #tryinvokemember
Вопрос:
Как бы вы реализовали алгоритм для выбора правильной перегрузки метода при переопределении следующего метода на DynamicObject
?
bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
Комментарии:
1. Мне это немного непонятно, но
args
массив будет разной длины, разных типов или обоих, если имя вызываемого элемента одно и то же.2. @vcsjones: только эти два аспекта или что-то большее?
3. Есть ошибка с обработкой аргументов way out / ref, и ее исправление не нашло своего пути в SP1. Я сам сомневаюсь, думая, что проблема заключается в большем, чем кажется на первый взгляд.
Ответ №1:
Если эта проблема с перегрузкой связана с перенаправлением на статически реализованные методы. Решением могло бы быть просто позволить dlr выполнять работу за вас. У Dynamitey с открытым исходным кодом есть статический метод, который создает весь код привязки dlr, соответствующим образом кэширует, а затем вызывает его, и dlr binder выполняет разрешение перегрузки. пример. Этот пример обрабатывает именованные / необязательные параметры и предполагаемые обобщения в разрешении перегрузки, однако DynamicObject не предоставляет явных обобщений или ссылок на параметры при вызове.
Ответ №2:
Это непросто, поскольку вы должны учитывать такие вещи, как неявное преобразование типов и параметры переменной длины (которые должны быть сопоставлены с массивами).
Класс MethodCallResolver в платформе Zentrum предоставляет пример того, как найти соответствующий метод.