The following gets a field from a DataTable and converts it to string. Is there a cleaner way to convert dynamic to string?
dynamic value = dataTable.Rows[i].Field<dynamic>(columnName);
value = (value == null) ? null : value.ToString();
string value = Convert.ToString(dataTable.Rows[i][columnName]);
标准格式将启动,无需泛型、扩展方法或动态等内容。
First of all as Marc mentioned in his answer " the standard formatting will kick in, without the need for things like generics, extension methods or dynamic " , so in your case you don't have to use dynamic
keyword , you can just convert directly to string, but talking about converting from dynamic to string I have two ways:
First way
string x = Convert.ToString(value) // value is a dynamic object
pros: this is a good way of conversion if you are not sure whether the compiled data type supports casting to string or it's hard coded as int for instance,
cons: this way can cause errors if your are trying to make
Convert.ToString(value) // value is a dynamic object
inside an Extension Method , when I do so it gives me this error : "Extension methods cannot be dynamically dispatched. Consider casting the dynamic arguments or calling the extension method without the extension method syntax" .
so if you are for example using Asp.Net Core HttpContext.Session.SetString()
and you put Convert.ToString(value) // value is dynamic object
as an inline conversion in the arguements it will give you the error in the cons secion, to resolve this you can assign a variable outside the function arguments to the Covert.ToString(value)
result then send the variable to the extension function arguements :
dynamic value = 10;
HttpContext.Session.SetString("key",Convert.ToString(value)); <-- error
resolve:
dynamic value = 10;
string x = Convert.ToString(value);
HttpContext.Session.SetString("key",x); // works fine
or use the second way (casting), make sure the compiled data type supports casting to string
HttpContext.Session.SetString("key",(string)value);
Second Way
cast dynamic
to string
if the compiled data type supports it
string x = (string)value; //value is dynamic object
pros: -it's useful if you want to make inline conversion inside an Extension method arguements -also useful if you want to make sure that the compiled data type supports casting to string and generate an exception based on this
cons: this doesn't work on all data types so if you want a more generic conversion method the first way is recommended
as mentioned here in MS docs "The dynamic type enables the operations in which it occurs to bypass compile-time type checking . Instead, these operations are resolved at run time. "
So the dynamic
variable's data type is compiled at run time and takes a type other than dynamic
, and you can use casting if the interpreted object supports it or use Convert.ToString()
for more generic type conversion.
PS: if you are converting to a data type other than string you may face data loss , like converting float to int , so be aware of that.
I have a case where the dynamic should be a string, but in an error case is a number (code I call into and can't change is doing that).
In my case I do:
string x = value as string;
if (x == null)
{
// error condition
} else {
//use x here
}
Convert.ToString doesn't work for me since my data are double[][] and result will be "System.Double[][]"
double[,] figure_geometry = new double[2, 2] { { 1.0, 1.0 }, { 2.0, 2.0 } };
string geometry = JsonSerializer.Serialize(figure_geometry);
Works well
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.