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

时间:2016-09-16 17:30:54

标签: c# object tostring typename

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

我甚至不确定“简单类型”的名称是什么,但它可以像这样定义......“一个表示低级变量类型的对象,包含单个值,不是类或任何可执行文件功能等“

我发现int,string,bool,double和令人惊讶的枚举将使ToString()具有非常可预测的结果。

int x = 0;
bool y = true;
double z = 1.59 // money
CustomEnum theEnum = CustomEnum.somevalue;

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

iList.ToString()导致“System.Collections.Generic.List`1 [System.Int32]” theClass.ToString()导致“STTI.NKI.Interop.MyClass”

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

我完全理解为什么会发生这种情况,并且我想知道是否有一种快速方法可以确定未知类型的对象是否将ToString()转换为期望值,而不是类型名称。我觉得这是一个像

这样的反模式
switch (theObject.GetType())
 case typeof(int):
 case typeof(bool):
 case typeof(doulble):
etc

我不确定这些条款是什么,所以谷歌搜索我的答案证明是困难的。

6 个答案:

答案 0 :(得分:4)

所以你想检查一个类型是否有一个被覆盖的ToString方法?为什么不检查ToString返回的值是否等于默认实现ToString返回的值?

here开始,我们知道ToString的默认实现是

return GetType().ToString();

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

bool toStringOverridden = someObject.GetType().ToString() !=
    someObject.ToString();

答案 1 :(得分:3)

ToString方法是虚方法,默认实现在Object类中定义,只返回对象类型的名称:

public virtual string ToString()
{
  return this.GetType().ToString();
}
例如,

int会覆盖此方法以返回有意义的表示。

您可以使用反射来检测类型是否会覆盖ToString方法,如下所示:

public static bool OverridesToString(Type type)
{
    return type.GetMethod("ToString", new Type[0]).DeclaringType != typeof(object);
}

如果确实如此,ToString方法很有可能会返回有意义的内容。

答案 2 :(得分:0)

选项1:确保每个Object都会覆盖ToString()。 选项2:使用反射来获取所有对象属性并将它们连接起来。

答案 3 :(得分:0)

也许你可以做类似的事情:

bool ToStringIsTyped<T>(T myObj)
{
    return myObj.ToString().Contains(typeof(T).FullName);
}

它可能不适用于所有情况,但可能会扩展

答案 4 :(得分:0)

我认为这就是你所看到的,在GetMethod中,第二个参数是一个空数组,用于监视.ToString(),只需将i.GetType().GetMethod("ToString", new Type[] { }).DeclaringType == typeof(object)转换为函数即可。

class Program
    {
        static void Main(string[] args)
        {
            int i = 55;
            var s = "some string";
            var x = new List<string>();
            Console.WriteLine(i.ToString());
            Console.WriteLine(i.GetType().GetMethod("ToString", new Type[] { }).DeclaringType == typeof(object));
            Console.WriteLine(s.ToString());
            Console.WriteLine(s.GetType().GetMethod("ToString",new Type[]{}).DeclaringType == typeof(object));
            Console.WriteLine(x.ToString());
            Console.WriteLine(x.GetType().GetMethod("ToString",new Type[]{}).DeclaringType == typeof(object));
        }
    }

答案 5 :(得分:0)

  

...确定未知类型的对象是否会将ToString()转换为期望值,而不是类型名称...

ToString()object的默认实施,根据documentation,返回&#34;对象类型的完全限定名称&#34;。

因此,我们可以提出这样的假设:每当ToString()被覆盖时,其输出将是&#34;有用的&#34;就你在问题中指明的意义而言。

要检测被调用的函数是否为覆盖,我们可以使用this answer,如下所示:

if(typeof(ObjectX).GetMethod("ToString").DeclaringType == typeof(ObjectX))
{
    /* ObjectX has overridden ToString() */
}
else
{
    /* ObjectX has inherited ToString() from its base class(es) */
}