我正在写一个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
我不确定这些条款是什么,所以谷歌搜索我的答案证明是困难的。
答案 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) */
}