首先,正如Marc在他的回答中提到的那样,“标准格式将启动,不需要使用泛型、扩展方法或动态”,因此在您的情况下,您不必使用dynamic
关键字,您可以直接转换为字符串,但是谈到从动态类型转换为字符串,我有两种方法:
第一种方式
string x = Convert.ToString(value) // value is a dynamic object
优点:如果您不确定编译后的数据类型是否支持转换为字符串,或者它是硬编码的(例如
int),则这是一种很好的转换方式。
缺点:如果您尝试在
扩展方法 中执行
Convert.ToString(value) // value is a dynamic object
,则此方法可能会导致错误。当我这样做时,会出现以下错误:
"Extension methods cannot be dynamically dispatched. Consider casting the dynamic arguments or calling the extension method without the extension method syntax"。
因此,如果您例如正在使用 Asp.Net Core 的
HttpContext.Session.SetString()
,并且您将
Convert.ToString(value) // value is dynamic object
作为内联转换放置在参数中,则会在
缺点部分出现错误。要解决此问题,您可以在函数参数外部分配一个变量来存储
Convert.ToString(value)
的结果,然后将该变量发送到扩展函数参数中。
dynamic value = 10
HttpContext.Session.SetString("key",Convert.ToString(value))
解决:
dynamic value = 10
string x = Convert.ToString(value)
HttpContext.Session.SetString("key",x)
或者使用第二种方式(强制转换),确保编译后的数据类型支持转换为字符串
HttpContext.Session.SetString("key",(string)value)
第二种方法
如果编译后的数据类型支持,cast dynamic
为string
string x = (string)value
优点:
- 如果您想在
扩展方法参数内进行内联转换,则非常有用
- 如果您想确保编译数据类型支持转换为
string并基于此生成异常,也很有用
缺点:这不能适用于所有数据类型,因此如果您想要更通用的转换方法,则建议使用第一种方式。
如MS文档中所述:“动态类型使其出现的操作可以绕过编译时类型检查。相反,这些操作在运行时解决。”
因此,dynamic
变量的数据类型在运行时编译,并且采用的类型不同于dynamic
,如果解释的对象支持,则可以使用casting或使用Convert.ToString()
进行更通用的类型转换。
附注:如果要转换为字符串以外的数据类型,则可能会面临数据丢失,例如将浮点数转换为整数,因此请注意。