Будут ли динамические объекты C# 4.0 иметь какие-то возможности для утиной печати?
-
06-07-2019 - |
Вопрос
По словам Андерса, в C# 4.0 мы собираемся получить динамические типы или объекты, «статический тип которых является динамическим».Это позволит любому разрешению вызова метода происходить во время выполнения, а не во время компиляции.Но будет ли возможность привязать динамический объект к какому-то контракту (и тем самым также получить для него полный интеллектуальный смысл), вместо того, чтобы разрешать любой вызов к нему, даже если вы знаете, что это вряд ли будет действительным?
Т.е.вместо того, чтобы просто
dynamic foo = GetSomeDynamicObject();
иметь возможность приводить или трансформировать его, чтобы ограничить его известным контрактом, например
IFoo foo2 = foo.To<IFoo>;
или даже просто
IFoo foo2 = foo as IFoo;
Не могу найти ничего подобного в существующих материалах по C# 4.0, но это кажется логическим продолжением динамической парадигмы.У кого-нибудь есть дополнительная информация?
Решение
Боюсь, я не знаю ничего, что действительно напоминало бы утиное печатание.у меня есть написал в блоге об идее, но я не жду никакой поддержки.Вероятно, было бы не так уж сложно использовать Reflection.Emit для создания класса, который будет генерировать реализацию любого заданного интерфейса, принимая динамический объект в конструкторе и просто передавая ему каждый вызов.Не идеально, но это может быть временным решением.
Другие советы
Это классная идея.Если я вас понимаю, вы описываете/предлагаете возможность CLR, при которой, когда вы пытаетесь привести динамический объект к интерфейсу, она должна посмотреть, какие методы/свойства поддерживает динамический объект, и посмотреть, есть ли у него такие, которые эффективно реализовать этот интерфейс.Затем CLR позаботится о «реализации IFoo» для объекта, так что вы сможете затем привести динамический объект к IFoo.Почти уверен, что это не будет поддержано, но это интересная идея.
Тобиас Херткорн ответил на мой вопрос здесь со ссылкой на него Сообщение блога показывающий пример использования метода Convert() в MetaObject для возврата динамического прокси.Это выглядит очень многообещающе.