При переопределении функции TryInvokeMember() DynamicObject, как выбрать правильную перегрузку для вызова?

#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 предоставляет пример того, как найти соответствующий метод.