Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# Best way to convert dynamic to string

Tags:

c#

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(); 
like image 344
Garfield Avatar asked Oct 19 '11 20:10

Garfield


2 Answers

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

the standard formatting will kick in, without the need for things like generics, extension methods or dynamic.

like image 88
Marc Gravell Avatar answered Oct 09 '22 22:10

Marc Gravell


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.

like image 41
Mawardy Avatar answered Oct 09 '22 21:10

Mawardy