C#将动态转换为字符串的最佳方法

以下从DataTable获取一个字段并将其转换为字符串。 有没有更简洁的方法将动态转换为字符串?

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

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

标准格式化将启动,而不需要像generics,扩展方法或动态的东西。

首先,正如Marc在他的回答中提到的“ 标准格式化将会启动,而不需要像generics,扩展方法或动态 ”这样的东西 ,所以在你的情况下你不必使用dynamic关键字,你可以直接转换字符串,但谈论从动态转换为字符串我有两种方式:

第一种方式

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

专业人士:如果你不确定编译的数据类型是否支持转换为字符串,或者它的硬编码为int ,这是一种很好的转换方式,例如,

缺点:这种方式可能会导致错误,如果你正在尝试使Convert.toString(value) // value is a dynamic object 扩展方法内的Convert.toString(value) // value is a dynamic object ,当我这样做它给我这个错误: “扩展方法不能动态调度。考虑在没有扩展方法语法的情况下转换动态参数或调用扩展方法“

因此,如果您使用Asp.Net Core HttpContext.Session.SetString()并将Convert.ToString(value) // value is dynamic object作为参数中的内联转换,它将为您提供错误。 ,要解决此问题,您可以在函数参数之外为Covert.toString(value)结果分配一个变量,然后将该变量发送到扩展函数arguements:

 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); 

第二种方式
如果编译的数据类型支持,则将dynamicstring

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

优点: - 如果你想在Extension方法中进行内联转换,那么它很有用 - 如果你想确保编译的数据类型支持转换为字符串并基于此生成exception,这也很有用

缺点:这不适用于所有数据类型,因此如果您想要更通用的转换方法,建议采用第一种方法


正如MS docs中所提到的那样“动态类型使其发生的操作能够绕过编译时类型检查 。而是在运行时解析这些操作

因此dynamic变量的数据类型在运行时编译并采用dynamic以外的类型,如果解释对象支持,则可以使用转换 ,或者使用Convert.toString()进行更通用的类型转换。

PS:如果你要转换为字符串以外的数据类型,你可能会面临数据丢失,比如将float转换为int,所以要注意这一点。