Существует ли версия CypeDynamic на C #? - PullRequest
5 голосов
/ 12 июля 2010

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

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

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

Ответы [ 5 ]

3 голосов
/ 12 июля 2010

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

2 голосов
/ 12 июля 2010

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

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

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

//implicit conversion
String myObject = myDynObject;

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

Вот ссылка на MSDN по этому поводу.

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

0 голосов
/ 06 декабря 2017

Функция C #, эквивалентная VB CTypeDynamic(), равна Convert.ChangeType().

Изменение имени помогает отличить функцию C # от настройки преобразования типа во время выполнения согласно переменной типа, а не от механизма типа dynamic.

Convert.ChangeType

Возвращает объект указанного типа, значение которого эквивалентно указанному объекту.

Conversion.CTypeDynamic

Преобразует объект в указанный тип.

...

Метод CTypeDynamic преобразует объект, переданный в качестве параметра Expression, в тип, указанный параметром TargetType.Если объект является динамическим объектом, метод CTypeDynamic применяет доступные динамические преобразования.

...

Метод CTypeDynamic сначала пытается выполнить преобразование с использованием пользовательскогоопределено, статическое преобразование

0 голосов
/ 16 июля 2010

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

Вам не нужно ничего импортировать. Просто используйте неявное и явное преобразование C # и ключевое слово «dynamic». Ответ Д. Хёрстера правильный.

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

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

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

0 голосов
/ 12 июля 2010

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

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

...