Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top