Следующее получает поле из DataTable и преобразует его в строку. Есть ли более чистый способ преобразования динамического в строку?
dynamic value = dataTable.Rows[i].Field<dynamic>(columnName);
value = (value == null) ? null : value.ToString();
Следующее получает поле из DataTable и преобразует его в строку. Есть ли более чистый способ преобразования динамического в строку?
dynamic value = dataTable.Rows[i].Field<dynamic>(columnName);
value = (value == null) ? null : value.ToString();
string value = Convert.ToString(dataTable.Rows[i][columnName]);
начнется стандартное форматирование без необходимости в таких вещах, как generics, методы расширения или динамические.
Прежде всего, как Марк, упомянутый в его ответе, "стандартное форматирование начнется, без необходимости в таких вещах, как дженерики, методы расширения или динамические", поэтому в вашем случае у вас нет для использования ключевого слова 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, поэтому имейте это в виду.