Подтвердить что ты не робот

С# Лучший способ конвертировать динамический в строку

Следующее получает поле из DataTable и преобразует его в строку. Есть ли более чистый способ преобразования динамического в строку?

dynamic value = dataTable.Rows[i].Field<dynamic>(columnName);
value = (value == null) ? null : value.ToString();
4b9b3361

Ответ 1

string value = Convert.ToString(dataTable.Rows[i][columnName]);

начнется стандартное форматирование без необходимости в таких вещах, как generics, методы расширения или динамические.

Ответ 2

Прежде всего, как Марк, упомянутый в его ответе, "стандартное форматирование начнется, без необходимости в таких вещах, как дженерики, методы расширения или динамические", поэтому в вашем случае у вас нет для использования ключевого слова dynamic вы можете просто преобразовать непосредственно в строку, но говоря о преобразовании из динамического в строку. У меня есть два способа:

Первый способ

string x = Convert.toString(value) // value is a dynamic object

профи: это хороший способ преобразования, если вы не уверены, поддерживает ли скомпилированный тип данных кастинг в строку или жесткий код как int,

минус. Этот способ может вызвать ошибки, если вы пытаетесь сделать Convert.toString(value) // value is a dynamic object внутри метод расширения, когда я это делаю дает мне эту ошибку: "Методы расширения не могут быть динамически посланный. Рассмотрим литье динамических аргументов или вызов метод расширения без синтаксиса метода расширения".

так что если вы, например, используете Asp.Net Core HttpContext.Session.SetString() и вы помещаете Convert.ToString(value) // value is dynamic object в качестве встроенного преобразования в аргументах, это даст вам ошибку в сегменте минус, чтобы решить эту проблему, вы можете назначить переменную вне аргументов функции для результата Covert.toString(value), тогда отправьте переменную в аргументы функции расширения:

dynamic value = 10;
HttpContext.Session.SetString("key",Convert.toString(value));  <-- error

Решимость:

dynamic value = 10;
string x = Convert.toString(value);
HttpContext.Session.SetString("key",x);  // works fine

или используйте второй способ (литье), убедитесь, что скомпилированный тип данных поддерживает листинг в строке

HttpContext.Session.SetString("key",(string)value);

Второй способ
cast dynamic to string если скомпилированный тип данных поддерживает его

string x = (string)value;  //value is dynamic object

профи: - полезно, если вы хотите сделать встроенное преобразование внутри Метод расширения- также полезно, если вы хотите убедиться, что скомпилированный тип данных поддерживает листинг в строку и генерирует исключение на основе этого

минус. Это не работает для всех типов данных, поэтому, если вам нужен более общий метод преобразования, рекомендуется использовать первый способ


как упомянуто здесь, в MS docs "Динамический тип включает операции, в которых он встречается, при проверке типа обхода времени компиляции. Вместо этого эти операции разрешены во время выполнения."

Таким образом, тип данных dynamic скомпилирован во время выполнения и принимает тип, отличный от dynamic, и вы можете использовать casting, если интерпретируемый объект поддерживает его или использует Convert.toString() для более общего преобразования типов.

PS: если вы переходите к типу данных, отличному от строки, вы можете столкнуться с потерей данных, например, преобразовать float в int, поэтому имейте это в виду.