Какой лучший источник информации о DLR (.NET 4.0 beta 1)?
-
06-09-2019 - |
Вопрос
В настоящее время я углубленно изучаю 2-е издание C # и пытаюсь реализовать "динамические буферы протокола", т.е.уровень динамической поддержки поверх моей существующей библиотеки буферов протоколов.Таким образом, у меня есть DlrMessage
тип, производный от DynamicObject
.После небольшой игры мне удалось заставить его реагировать на простые свойства с удивительно небольшим количеством кода, но я хочу пойти намного дальше - и действительно понять, что происходит.
Пока я не нашел никаких хороших объяснений DLR - и многие записи в блогах фактически устарели, поскольку все изменилось (я полагаю) между предыдущим CTP и .NET 4.0 beta 1.Тот Самый Документация MSDN для DynamicObject на данный момент это довольно минимально.
Мой самый непосредственный вопрос заключается в том, есть ли простой способ сказать: "Используйте отражение для привязки любых вызовов, которые я не могу обработать, используя этот конкретный объект". (Другими словами, я хочу дополнить существующую привязку отражения, а не делать все сам, если это возможно.) К сожалению, я не очень далеко продвинулся на догадках.
Существуют ли какие-либо окончательные и недавние источники документации, о которых я должен знать?Я знаю, что часть написания статьи о новой технологии является исследование, но я был бы признателен за руку помощи :)
Решение
Лучший источник, который я нашел и часто читаю, - это посты Криса Барроу за последние годы на его блог.
Есть также официальная страница документации 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=ru
Надеюсь, это поможет
Алекс
По умолчанию DynamicObject скажет "возврат к отражению", если ваши функции Try * вернут false.Таким образом, вы уже можете наследовать и добавлять свойства / поля / методы в свой подкласс, которые все будут обрабатываться отражением, если динамический путь не выполняет поиск.
Углубляясь в изучение, вы, возможно, захотите взглянуть на IDynamicMetaObjectProvider.На этом более низком уровне способ, которым вы говорите о возврате к отражению, заключается в вызове метода Fallback * для входящего DynamicMetaObjetBinder.Затем это позволяет вызывающему языку обеспечить разрешение.Затем вы можете вернуть этот AST или скомпоновать его в более крупный AST, который вы возвращаете.В основном запасной вариант * позволяет вам получить AST, который будет выдан вызывающим языком, включая правильную ошибку (исключение, не определено в JS и т.д.).
Способ, которым DynamicObject выполняет возврат к reflection, заключается в том, что он фактически дважды вызывает резервный метод binder * .В первый раз он возвращается без параметра "errorSuggestion".При этом выдается либо ошибка, либо AST, который был создан с использованием отражения.Затем он выдает AST, который представляет собой что-то вроде:
if(TryGetMember("name", out value)) {
return value;
} else {
return resultOffallback;
}
Затем он берет этот комбинированный AST и фактически передает его в качестве предложения об ошибке для связующего во 2-м резервном варианте.Затем связующий должен учесть это предложение errorSuggestion, если привязка окажется неудачной.Но если присутствует элемент .NET, то errorSuggestion отбрасывается, и привязка .NET имеет приоритет.И, наконец, если язык не знает, была ли привязка успешной (напримерв языке есть функция типа "метод отсутствует") он снова может комбинировать ASTS с динамическими проверками.Таким образом, используя запасной вариант, вы можете не только сказать "выполнить отражение", но и выбрать, будут ли динамические или статические элементы иметь приоритет.