Будут ли в динамических объектах C # 4.0 какие-либо средства для печати утки? - PullRequest
5 голосов
/ 03 ноября 2008

В C # 4.0 мы собираемся получить динамические типы или объекты, чей «статический тип является динамическим», согласно Андерсу. Это позволит любому разрешению вызова метода происходить во время выполнения, а не во время компиляции. Но будет ли возможность привязать динамический объект к какому-либо контракту (и, таким образом, также вернуть ему полный смысл), вместо того, чтобы разрешать любой вызов, даже если вы знаете, что он вряд ли будет действительным.

т.е. вместо просто

dynamic foo = GetSomeDynamicObject();

имеют возможность разыграть или преобразовать его, чтобы ограничить его известным контрактом, таким как

IFoo foo2 = foo.To<IFoo>;

или даже просто

IFoo foo2 = foo as IFoo;

Не могу найти ничего подобного в существующих материалах для C # 4.0, но это кажется логическим продолжением динамической парадигмы. Кто-нибудь с дополнительной информацией?

Ответы [ 3 ]

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

Боюсь, я не знаю ничего похожего на печатание утки. Я написал об этой идее , но не ожидаю поддержки. Вероятно, было бы не сложно использовать Reflection.Emit для создания класса, который будет генерировать реализацию любого данного интерфейса, принимая динамический объект в конструкторе и просто передавая ему каждый вызов. Не идеально, но это может быть пробел.

1 голос
/ 04 ноября 2008

Тобиас Херткорн ответил на мой вопрос здесь со ссылкой на его blogpost , показывающий пример использования метода Convert () в MetaObject для возврата динамического прокси. Это выглядит очень многообещающим.

1 голос
/ 04 ноября 2008

Это крутая идея. Если я вас понимаю, вы описываете / предлагаете возможности CLR, в результате чего, когда вы пытаетесь привести динамический объект к интерфейсу, он должен посмотреть, какие методы / свойства поддерживает динамический объект и посмотреть, есть ли у него те эффективно реализовать этот интерфейс. Тогда CLR позаботится о «реализации IFoo» на объекте, чтобы вы могли затем привести динамический объект к IFoo. Почти уверен, что это не будет поддерживаться, но это интересная идея.

...