Существует ли версия C# CTypeDynamic?

Из документации:

Метод CTypeDynamic применяет динамические преобразования в соответствии с семантикой преобразования, определенной самим объектом. Если динамический объект наследовался DynamicObject, метод CTypeDynamic сначала пытается выполнить преобразование при помощи пользовательского, статического преобразования. Если пользовательское, статическое преобразование перестало работать, метод CTypeDynamic пытается выполнить преобразование при помощи динамических преобразований. Если динамический объект реализует IDynamicMetaObjectProvider, метод CTypeDynamic дает приоритет динамическим преобразованиям по пользовательским, статическим преобразованиям.

Есть ли что-то в C#, который делает это? Или сделайте я просто должен импортировать библиотеку VB, которая имеет его.

5
задан Henk Holterman 12 July 2010 в 19:56
поделиться

4 ответа

Если вы используете C # 4.0, то да, называется динамическим. Вот ссылка

3
ответ дан 14 December 2019 в 18:55
поделиться

Для этого не нужно импортировать библиотеку VB.

Если вы переопределяете TryConvert в классе, производном от DynamicObject, то C # позволяет вам неявно вызывать это через неявное или явное приведение.

//explicit conversion
String myObject = (String)myDynObject;

//implicit conversion
String myObject = myDynObject;

VB.NET поддерживает только явные преобразования. C # поддерживает как неявное, так и явное.

Вот ссылка на MSDN об этом.

Надеюсь, это поможет!

2
ответ дан 14 December 2019 в 18:55
поделиться

Я предполагаю, что сначала приведение к динамическому, а затем к целевому типу должно помочь.
Динамический доступен в C # 4.0 / VS 2010

В C # 3.0 / VS2008 вы, вероятно, сможете обойтись без выражений. Если я правильно помню, библиотека «MiscUtil» содержит функции для использования операторов преобразования в их общем классе операторов.

0
ответ дан 14 December 2019 в 18:55
поделиться

Короткий ответ

Вам не нужно ничего импортировать. Просто используйте неявное и явное преобразование C# и ключевое слово "dynamic". Ответ D Hoerster правильный.

Длинный ответ

В C# есть отдельный тип для работы с динамическими объектами - тип "dynamic". Но в VB для этого нет выделенного типа, так как динамическое поведение реализуется через позднее связывание. Поэтому в VB динамические объекты, которые нуждаются в реальном динамическом связывании, иногда трудно отличить от просто "объектов". CType обрабатывает преобразования "объектов" в типы. В большинстве случаев это нормально. Однако, когда вы имеете дело с реализациями интерфейса IDynamicMetaObjectProvider, это может вызвать проблемы. CType не может понять, имеет ли он дело с "объектом" или "динамическим объектом" - нет синтаксиса, чтобы отличить одно от другого, и CType не хочет вызывать динамические связки для всех объектов, определенных через позднюю привязку. Он предполагает, что все объекты, с которыми он имеет дело, являются "объектами", а не "динамическими объектами". Поэтому вам нужно как-то сообщить компилятору, что вы имеете дело с динамическим объектом. Вместо того чтобы создавать новый "динамический" тип, команда VB решила просто добавить еще одну функцию преобразования - CTypeDynamic. Она явно сообщает компилятору, что вы преобразуете динамический тип в какой-то другой тип (опять же, в C# это не нужно, поскольку вы уже определили объект с помощью ключевого слова dynamic, и компилятор уже знает, с чем он имеет дело).

Хорошей иллюстрацией проблемы является метод DynamicObject.TryConvert. Попробуйте заменить CTypeDynamic на CType в примере VB и вы увидите исключение. Опять же, это происходит потому, что CType ничего не знает о динамической связке времени выполнения. Но в C# runtime binder вызывается для всех объектов, определенных ключевым словом dynamic, поэтому ему не нужна эта специальная функция.

0
ответ дан 14 December 2019 в 18:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: