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

Gar*_*eld 39 c#

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

dynamic value = dataTable.Rows[i].Field<dynamic>(columnName);
value = (value == null) ? null : value.ToString();
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 75

string value = Convert.ToString(dataTable.Rows[i][columnName]);
Run Code Online (Sandbox Code Playgroud)

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


Maw*_*rdy 12

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

第一种方式

string x = Convert.toString(value) // value is a dynamic object
Run Code Online (Sandbox Code Playgroud)

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

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

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

dynamic value = 10;
HttpContext.Session.SetString("key",Convert.toString(value));  <-- error
Run Code Online (Sandbox Code Playgroud)

解决:

dynamic value = 10;
string x = Convert.toString(value);
HttpContext.Session.SetString("key",x);  // works fine
Run Code Online (Sandbox Code Playgroud)

或者使用第二种方式(强制转换),确保编译的数据类型支持转换为字符串

HttpContext.Session.SetString("key",(string)value);
Run Code Online (Sandbox Code Playgroud)

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

string x = (string)value;  //value is dynamic object
Run Code Online (Sandbox Code Playgroud)

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

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


正如MS docs中所提到的那样"动态类型使其发生的操作能够绕过编译时类型检查.相反,这些操作在运行时得到解决. "

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

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

  • 虽然这可能提供问题的答案,但需要一些解释.请更新问题,并解释此解决方案的工作原理和原因. (2认同)
  • 不能保证字段*的值是*字符串,因此为什么OP要求如何将*转换为字符串。仅当对象实际上是一个字符串时,您的代码才能工作,而只要`Convert.ToString`可以处理它,接受的答案就可以工作,这很有可能是堆。请注意,作为示例,如果基础值为“ int”,则将收到“ RuntimeBinderException”的运行时错误:“无法将类型'int'转换为'string'”。 (2认同)