2009-05-31 2 views
20

В настоящее время я изучаю второе издание C# в глубине и пытаюсь реализовать «буферы динамических протоколов» - то есть уровень динамической поддержки поверх существующей библиотеки буферов протокола. Таким образом, у меня есть тип DlrMessage, полученный от DynamicObject. После немного поиграть, мне удалось заставить его ответить на простые свойства с удивительно маленьким кодом, но я хочу пойти намного дальше - и действительно понять, что происходит.Каков наилучший источник информации о DLR (.NET 4.0 beta 1)?

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

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

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

+5

Смотрите и здесь, я думал, вы имели в виду железнодорожную ветку Доклендс. :) шутка – cletus

+10

Закрытие Клетуса как дубликат: http://stackoverflow.com/questions/655194/how-does-the-dlr-work;) –

ответ

23

Лучший источник я нашел и прочитал часто является в последние годы стоит сообщений Криса Норе на his blog ,

Существует также official DLR documentation page, который находится за пределами main DLR site.

+1

Ooh, что выглядит очень удобно, спасибо - мне особенно нравится то, что это все последние :). «Вступление в библиотеку» выглядит так, как будто «точно» правильно. –

+36

Хорошо, что был ваш вопрос. «... недавние источники документации ...» :) Есть ли значок для ответа, принятого Джоном Скитом? – TheSoftwareJedi

5

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

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

Надежда это помогает

Alex

3

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

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

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

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

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

+1

Спасибо. Проблема с DynamicObject в том, что он возвращается к размышлениям на * этот * объект - Я хотел бы его, чтобы возвратиться к отражению на * иной * объект, и я подозреваю, что для работы я бы реализовать IDynamicMetaObjectProvider, который больше проблем, чем это стоит в этом случае. Я закончил копирование загрузки методов в мой динамический тип, который просто прокси-сервер на другой объект, поэтому я все еще получаю удовольствие от размышлений. Уродливо, но это работает. –

+1

@Jon Skeet Вы пишете простой файл T4, чтобы легко декодировать этот шаблон адаптера для любого объекта в частичном классе. Если вы зададите такой вопрос, я отправлю вам решение! – TheSoftwareJedi

 Смежные вопросы

  • Нет связанных вопросов^_^