我正在做的是查找哈希表中特定字段的值。该对象可以是少数原始类型,它们的值注定要放在XML中,但它来自哈希表作为对象。所以我有需要决定类型是什么的问题,将其抛出然后使用ToString类型。如果我不需要强制转换它会很好但是它会调用对象类型的ToString而不是实际类型的对应方法。
以下代码在功能上是正确的,但我对此并不满意。也许遵循这条舒适的道路将导致我成为一个纯粹主义者。无论哪种方式,我都非常感谢有一种更好的方法来写这个如果存在的话。
public string GetColumnValue(string columnName)
{
object value = item[columnName];
if (value == null)
return string.Empty;
if (value.GetType() == typeof(string))
{
return (string)value;
}
else if (value.GetType() == typeof(double))
{
return ((double)value).ToString();
}
...
}
答案 0 :(得分:8)
如果您所做的只是调用ToString
,由于C#的多态性,ToString将调用正确的实现,即使您拥有的只是对Object的引用。
E.g:
var d=DateTime.Now;
object od=d;
Console.WriteLine(od.ToString());
Console.WriteLine(d.ToString()); //same as previous line
答案 1 :(得分:1)
答案 2 :(得分:1)
修改强>
如果有兴趣的话,测试代码就在这里:http://gist.github.com/raw/305787/dc5349d9f6fa37ee5d621b43ec92dade60fe1c8d/ToStringTests.cs
下面你会找到我的原始答案。有人指出你可能有一个没有你喜欢的ToString()的类型(因为它使用了Object或链中更高的东西)。在3.0+中处理此问题的最佳方法是使用这样的扩展方法:
public static class ToStringExpander
{
public static string MyToString (this Object x)
{
return x.ToString();
}
public static string MyToString (this mytype x)
{
return "This is the to string of mytype!";
}
}
如果将ToString()更改为MyToString()
,现在mytype将使用下面的GetColumnValue原帖
这将做你想要的。
public string GetColumnValue(string columnName)
{
object value = item[columnName];
if (value == null)
return string.Empty;
return object.ToString();
}
或者如果你想看老派:
public string GetColumnValue(string columnName)
{
return (item[columnName] == null ? string.Empty : item[columnName].ToString());
}
当然真正的老派是制作一个#define宏...
答案 3 :(得分:0)
为什么不能在value
上使用.ToString(),因为.ToString()是从对象继承的?将调用继承链上的适当类型的.ToString()。
答案 4 :(得分:0)
ToString()
是一种虚拟方法。这意味着对该方法的任何调用都将在运行时选择正确的实现(“最派生类型”)。由于所有主要类型都覆盖ToString()
来执行正确的操作,因此没有理由将任何类型的变量转换为任何类型。
对于虚方法,变量的类型与选择正确的实现无关。重要的是被引用对象的运行时类型。
int x = 10;
object o = x;
x.ToString();
o.ToString();
对ToString()
的两次调用都将执行相同的代码(减去object
版本中发生的取消装箱,因为int
是值类型。)