2013-05-18 5 views
4

Я пытаюсь написать приятный API-интерфейс для связующего кода на основе правил в C#. ConfigManager.GetSection(...) возвращает объект, поэтому я хочу вернуть динамический объект, который при нажатии на требуемый тип вызывает сопоставление.Кастинг C# DynamicObject произвольному типу

Есть ли способ в C# 4 + создать динамический класс, который может обрабатывать вызов при наличии явного приведения к нему?

например.

MyConfig config = (MyConfig)ConfigurationManager.GetSection("some/section"); 

В этом случае динамический объект из ConfigurationManager будет вызван броском, чтобы выполнить некоторые конфигурации магии (я решил, что немного)

ответ

2

Да, DynamicObject имеет переопределение-способный TryConvert. Когда подкласс DynamicObject выполняется (или неявно преобразован для назначения), TryConvert вызывается, и вы можете получить динамические данные об вызове из параметра binder перед возвратом вашего результата.

Свойство binder.Type предоставляет тип, с которым объект должен быть преобразован. Для примера для примера (String) sampleObject в C# (CType (sampleObject, Type) в Visual Basic), где sampleObject является экземпляром класса, производного от класса DynamicObject, binder.Type возвращает тип String. Свойство binder.Explicit содержит информацию о типе преобразования, которое происходит. Он возвращает true для явного преобразования и false для неявного преобразования .

+1

Спасибо. Я попробовал это перед тем, как спросить (реализовал каждый виртуальный метод DynamicObject) и просто увидел исключения, которые были подняты - оказалось, что это были первые случайные исключения, и я был в ярости, прежде чем TryConvert вызывается! –

1

Есть много проектов, которые касаются вашей потребности.

Отъезд AutoConfig например.

+0

Спасибо - этот проект частично веселый, но он также сделает больше, чем AutoConfig - например, поддержка произвольно сложных графиков объектов, коллекций и пользовательских связующих (и POCOs) –

+0

В случае, если вам интересно, я закончил этот проект - http://www.github.com/spadger/simple-config –

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