Как реализовать интерфейс IDynamicObject в C # 4? - PullRequest
6 голосов
/ 29 октября 2008

Чтобы реализовать семантику «отсутствующий метод» и тому подобное в C # 4.0, вы должны реализовать IDynamicObject:

public interface IDynamicObject
{
  MetaObject GetMetaObject(Expression parameter);
}

Насколько я понимаю, IDynamicObject фактически является частью DLR, поэтому он не нов. Но я не смог найти много документации по нему.

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

Особенно, как именно вы должны обрабатывать параметр-параметр?

Ответы [ 5 ]

4 голосов
/ 29 октября 2008

Короткий ответ: MetaObject отвечает за фактическую генерацию кода, который будет запускаться на сайте вызовов. Механизм, который он использует для этого, - это деревья выражений LINQ, которые были улучшены в DLR. Таким образом, вместо того, чтобы начинать с объекта, он начинается с выражения, представляющего объект, и в конечном итоге ему нужно будет вернуть дерево выражений, которое описывает действие, которое необходимо предпринять.

При игре с этим, пожалуйста, помните, что версия System.Core в CTP была взята из снимка в конце августа. Он не очень точно соответствует какой-либо конкретной бета-версии IronPython. С тех пор в DLR был внесен ряд изменений.

Кроме того, для совместимости с CLR v2 System.Core выпуски IronPython, начиная с бета-версии 4 или бета-версии 5, теперь переименовывают все, что находится в пространстве имен System, в пространство имен Microsoft.

3 голосов
/ 04 ноября 2008

Если вы хотите, чтобы пример из конца в конец, включая исходный код, приводил к динамическому объекту, который хранит значение для произвольных свойств в Словаре, тогда my post "Первый взгляд на Duck Typing in C # 4.0" быть подходящим для вас. Я написал этот пост, чтобы показать, как динамический объект может быть приведен к статически типизированным интерфейсам. Он имеет полную рабочую реализацию Duck, которая является IDynamicObject и может действовать как IQuack.

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

2 голосов
/ 30 октября 2008

Я только что написал в блоге о том, как это сделать здесь:

http://mikehadlow.blogspot.com/2008/10/dynamic-dispatch-in-c-40.html

0 голосов
/ 29 октября 2008

Эта презентация также предоставляет много информации о DLR:

0 голосов
/ 29 октября 2008

Вот что я понял до сих пор:

Dynamic Language Runtime в настоящее время поддерживается как часть проекта IronPython . Так что это лучшее место для получения информации.

Самым простым способом реализации класса, поддерживающего IDynamicObject, является, по-видимому, наследование Microsoft.Scripting.Actions.Dynamic и переопределение соответствующих методов, например, метода Call для реализации семантики вызова функции. Похоже, Microsoft.Scripting.Actions.Dynamic не был включен в CTP, но тот, что из IronPython 2.0, похоже, будет работать.

Мне все еще неясно точное значение параметра-параметра, но, похоже, он обеспечивает контекст для привязки динамического объекта.

...