以下从DataTable获取一个字段并将其转换为字符串。有没有更简洁的方法将动态转换为字符串?
dynamic value = dataTable.Rows[i].Field<dynamic>(columnName);
value = (value == null) ? null : value.ToString();
答案 0 :(得分:72)
string value = Convert.ToString(dataTable.Rows[i][columnName]);
标准格式化将启动,无需泛型,扩展方法或动态等。
答案 1 :(得分:9)
首先,作为 Marc 在他的回答中提到&#34; 标准格式化将会启动,而不需要像泛型,扩展方法或动态& #34; ,所以在你的情况下,你不必使用dynamic
关键字,你可以直接转换为字符串,但谈论从动态转换为字符串我有两种方式:
第一种方式
string x = Convert.toString(value) // value is a dynamic object
专业人士:如果你不确定编译的数据类型是否支持转换为字符串或者它的硬编码,这是一种很好的转换方式 例如 int ,
缺点:如果您尝试在Extension Method内
Convert.toString(value) // value is a dynamic object
进行HttpContext.Session.SetString()
,这种方式可能会导致错误 给我这个错误:&#34;扩展方法不能动态 出动。考虑强制转换动态参数或调用 扩展方法没有扩展方法语法&#34; 。
所以如果您使用的是Asp.Net Core Convert.ToString(value) // value is dynamic object
并且你将Covert.toString(value)
作为内联转换放入了缺点中的错误,为了解决这个问题,你可以在函数参数之外为{{1然后结果将变量发送到扩展函数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);
第二种方式
如果已编译的数据类型支持,则cast dynamic
到string
string x = (string)value; //value is dynamic object
专业人士 - 如果您想在内部进行内联转换,这非常有用 Extension method争论 - 如果你想确保编译的数据类型支持转换为 string 并基于此生成异常
,那么也很有用缺点:这不适用于所有数据类型,因此如果您想要更通用的转换方法,建议采用第一种方式
如MS docs&#34中所述;动态类型使其能够执行绕过编译时类型检查的操作。相反,这些操作在运行时得到解决。&#34;
因此dynamic
变量的数据类型在运行时编译并采用dynamic
以外的类型,如果解释的对象支持它,则可以使用casting或使用Convert.toString()
进行更通用的类型转换。
PS:如果你要转换为字符串以外的数据类型,你可能会面临数据丢失,比如将float转换为int,所以要注意这一点。
答案 2 :(得分:0)
在某些情况下,dynamic应该是一个字符串,但在错误情况下是一个数字(我调用并不能更改的代码正在执行此操作)。
就我而言:
string x = value as string;
if (x == null)
{
// error condition
} else {
//use x here
}