Подтвердить что ты не робот

Какой лучший источник информации о DLR (.NET 4.0 beta 1)?

В настоящее время я изучаю второе издание С# в Depth и пытаюсь реализовать "буферы динамических протоколов" - то есть уровень динамической поддержки поверх существующей библиотеки буферов протокола. Таким образом, у меня есть тип DlrMessage, полученный из DynamicObject. Немного поиграв, мне удалось заставить его ответить на простые свойства с замечательно маленьким кодом, но я хочу пойти намного дальше - и действительно понять, что происходит.

До сих пор я не нашел никаких хороших объяснений DLR - и многие сообщения в блогах теперь устарели, так как все изменилось (я считаю) между предыдущим CTP и .NET 4.0 beta 1. документация MSDN для DynamicObject на данный момент довольно минимальная.

Мой самый непосредственный запрос заключается в том, есть ли простой способ сказать: "Использовать отражение для привязки любых вызовов, с которыми я не могу справиться, используя этот конкретный объект". (Другими словами, я хочу расширить существующее привязку привязки, а не делать все сам, если это возможно.) К сожалению, я не очень далек от догадок.

Есть ли какие-то окончательные и последние источники документации, о которых я должен знать? Я знаю, что часть написания новой технологии - это исследование, но помощь будет оценена:)

4b9b3361

Ответ 2

Я тоже изучаю это на данный момент, и информации пока нет. Я не могу помочь с вашим запросом, но ниже приведена некоторая информация:

В видеороликах 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

Надеюсь, что это поможет

Алекс

Ответ 3

По умолчанию 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, вы можете не только произнести отражение, но также можете выбрать, имеют ли динамические или статические элементы приоритет.