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

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

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

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

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


person Jon Skeet    schedule 31.05.2009    source источник
comment
Смотри, и здесь я думал, ты имел в виду Доклендский легкорельсовый транспорт. :)   -  person cletus    schedule 31.05.2009
comment
Закрытие шутки Клетуса как дубликата: stackoverflow.com/questions/655194/how-does-the-dlr -работа;)   -  person Jon Skeet    schedule 31.05.2009


Ответы (3)


Лучший источник, который я нахожу и часто читаю, - это сообщения Криса Берроу за последние годы в его блоге.

Также имеется официальная страница документации DLR, которая с основного сайта DLR.

person TheSoftwareJedi    schedule 31.05.2009
comment
Ооо, это выглядит очень удобно, спасибо - мне особенно нравится тот факт, что все это недавно :) Введение автора библиотеки выглядит так, как будто это совершенно правильная вещь. - person Jon Skeet; 31.05.2009
comment
Что ж, это БЫЛ твой вопрос. ... последние источники документации ... :) Есть ли значок за то, что Джон Скит принял ответ? - person TheSoftwareJedi; 31.05.2009

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

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

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

Алекс

person alexmac    schedule 31.05.2009

По умолчанию DynamicObject скажет «возврат к отражению», если ваши функции Try * вернут false. Таким образом, вы уже можете наследовать и добавлять свойства / поля / методы в свой подкласс, которые будут обрабатываться путем отражения, если динамический путь не выполняет поиск.

Если углубиться в подробности, вы можете взглянуть на IDynamicMetaObjectProvider. На этом более низком уровне способ возврата к отражению - это вызов метода Fallback * для входящего DynamicMetaObjetBinder. Затем это позволяет вызывающему языку предоставить разрешение. Затем вы можете вернуть этот AST или составить его в более крупный AST, который вы возвращаете. В основном Fallback * позволяет вам получить AST, который будет выдавать вызывающий язык, включая правильную ошибку (исключение, неопределенное в JS и т. Д.).

Способ, которым DynamicObject выполняет откат к отражению, состоит в том, что он фактически дважды вызывает метод Fallback * связующего объекта. В первый раз он возвращается без параметра errorSuggestion. Это вызывает либо ошибку, либо AST, построенный с использованием отражения. Затем он создает AST, который выглядит примерно так:

if(TryGetMember("name", out value)) {
   return value;
} else {
   return resultOffallback;
}

Затем он берет этот комбинированный AST и фактически передает его в качестве предложения об ошибке для связующего при втором резервном копировании. Связующее должно тогда учитывать это errorSuggestion, если привязка не удалась. Но если присутствует член .NET, errorSuggestion отбрасывается, и привязка .NET имеет приоритет. И, наконец, если язык не знает, было ли привязка успешной (например, в языке есть функция типа «отсутствует метод»), он может снова объединить AST с динамическими проверками. Таким образом, используя Fallback, вы можете не только сказать, что делать отражение, но и выбрать, будут ли динамические или статические члены иметь приоритет.

person Dino Viehland    schedule 31.05.2009
comment
Спасибо. Проблема с DynamicObject заключается в том, что он возвращается к отражению на this объекте - я бы хотел, чтобы он вернулся к отражению на другом объекте, и я подозреваю, что это работа Мне бы пришлось реализовать IDynamicMetaObjectProvider, что в данном случае больше проблем, чем оно того стоит. В итоге я скопировал множество методов в свой динамический тип, которые просто прокси-серверы для другого объекта, поэтому я все еще получаю преимущество отражения. Уродливо, но работает. - person Jon Skeet; 01.06.2009
comment
@Jon Skeet Вы легко пишете простой файл T4 для кодогенерации этого шаблона адаптера для любого объекта в частичном классе. Если вы зададите такой вопрос, я выложу для вас решение! - person TheSoftwareJedi; 18.06.2009