如何确定一个对象是否可以 ToString 转换为值或类型名称?

Car*_*omp 5 c# object tostring typename

我正在编写 php 服务和我们的 crm 之间的互操作。我需要做的一件事是确保简单类型被转换为 ToString() 以便稍后在 json 转换器中使用。

我什至不确定“简单类型”的名称是什么,但它可以这样定义...“代表低级变量类型的对象,包含单个值,而不是类或任何具有可执行函数等的对象”

我发现 int、string、bool、double 和令人惊讶的 enum 将使用 ToString() 并获得相当可预测的结果。

int x = 0;
bool y = true;
double z = 1.59 // money
CustomEnum theEnum = CustomEnum.somevalue;
Run Code Online (Sandbox Code Playgroud)

x.ToString() 结果为“0”

y.ToString() 结果为“true”

z.ToString() 结果为“1.59”

theEnum.ToString() 结果为“somevalue”

但如果我用这个:

List<int> iList = new List<int>();
iList.Add(1);

MyClass theClass = new MyClass();
Run Code Online (Sandbox Code Playgroud)

iList.ToString() 结果为“System.Collections.Generic.List`1[System.Int32]” Class.ToString() 结果为“STTI.NKI.Interop.MyClass”

我不限于列表。我可以有一个 ExpandoObject 或一个类等。

我完全理解为什么会发生这种情况,并且我想知道是否有一种快速方法来确定未知类型的对象是否将 ToString() 转换为预期值,而不是类型名称。我发现做类似的事情是一种反模式

switch (theObject.GetType())
 case typeof(int):
 case typeof(bool):
 case typeof(doulble):
etc
Run Code Online (Sandbox Code Playgroud)

我不确定这些术语是什么,所以谷歌搜索我的答案很困难。

Swe*_*per 6

那么你想检查一个类型是否有重写的ToString方法?为什么不只检查返回的值是否ToString等于默认实现返回的值ToString

这里,我们知道默认实现ToString

return GetType().ToString();
Run Code Online (Sandbox Code Playgroud)

因此,我们可以使用它来检查对象是否重写了该ToString方法:

bool toStringOverridden = someObject.GetType().ToString() !=
    someObject.ToString();
Run Code Online (Sandbox Code Playgroud)