Ответ 1
Лучший источник, который я нашел и часто читаю, - это последние годы работы Chris Burrow на его блоге.
Там также находится официальная страница документации DLR которая находится вне основной DLR сайт.
В настоящее время я изучаю второе издание С# в Depth и пытаюсь реализовать "буферы динамических протоколов" - то есть уровень динамической поддержки поверх существующей библиотеки буферов протокола. Таким образом, у меня есть тип DlrMessage
, полученный из DynamicObject
. Немного поиграв, мне удалось заставить его ответить на простые свойства с замечательно маленьким кодом, но я хочу пойти намного дальше - и действительно понять, что происходит.
До сих пор я не нашел никаких хороших объяснений DLR - и многие сообщения в блогах теперь устарели, так как все изменилось (я считаю) между предыдущим CTP и .NET 4.0 beta 1. документация MSDN для DynamicObject на данный момент довольно минимальная.
Мой самый непосредственный запрос заключается в том, есть ли простой способ сказать: "Использовать отражение для привязки любых вызовов, с которыми я не могу справиться, используя этот конкретный объект". (Другими словами, я хочу расширить существующее привязку привязки, а не делать все сам, если это возможно.) К сожалению, я не очень далек от догадок.
Есть ли какие-то окончательные и последние источники документации, о которых я должен знать? Я знаю, что часть написания новой технологии - это исследование, но помощь будет оценена:)
Лучший источник, который я нашел и часто читаю, - это последние годы работы Chris Burrow на его блоге.
Там также находится официальная страница документации DLR которая находится вне основной DLR сайт.
Я тоже изучаю это на данный момент, и информации пока нет. Я не могу помочь с вашим запросом, но ниже приведена некоторая информация:
В видеороликах PDC есть достаточная сумма.
http://channel9.msdn.com/pdc2008/TL44/
http://channel9.msdn.com/pdc2008/TL10/
В этой статье рассказывается о том, как DLR работает с IronPython: http://msdn.microsoft.com/en-us/magazine/cc163344.aspx
В предварительном просмотре учебных материалов есть очень небольшое количество: http://www.microsoft.com/downloads/details.aspx?FamilyID=752cb725-969b-4732-a383-ed5740f02e93&displayLang=en
Надеюсь, что это поможет
Алекс
По умолчанию DynamicObject скажет "возврат к отражению", если ваши функции Try * вернут false. Таким образом, вы уже можете наследовать и добавлять свойства/поля/методы в ваш подкласс, которые будут обрабатываться отражением, если динамический путь не выполняет поиск.
Более подробно вы можете посмотреть IDynamicMetaObjectProvider. На этом более низком уровне, как вы говорите, отключение к отражению - это вызов метода Fallback * на входящем DynamicMetaObjetBinder. Это позволяет языку вызова предоставить разрешение. Затем вы можете вернуть этот АСТ или составить его в более крупный АСТ, с которого вы вернетесь. В основном Fallback * позволяет получить AST, который будет вызывать язык вызова, включая правильную ошибку (исключение, undefined в JS и т.д.).
То, как DynamicObject делает откат к отражению, заключается в том, что он на самом деле вызывает метод перехвата Fallback * дважды. В первый раз он возвращается без параметра "errorSuggestion". Это получает либо ошибку, либо AST, которая была построена с использованием отражения. Затем он создает AST, что-то вроде:
if(TryGetMember("name", out value)) {
return value;
} else {
return resultOffallback;
}
Затем он берет этот комбинированный АСТ и фактически передает его в качестве предложения об ошибке для связующего на второй резерв. Затем связующее должно уважать эту ошибку, если привязка не увенчалась успехом. Но если присутствует .NET-член, то errorSuggestion отбрасывается, а привязка .NET имеет приоритет. И, наконец, если язык не знает, была ли привязка успешной (например, язык имеет функцию типа "отсутствует метод" ), он может снова объединить динамические проверки ASTs с динамическими. Таким образом, используя Fallback, вы можете не только произнести отражение, но также можете выбрать, имеют ли динамические или статические элементы приоритет.