一种干净的方式来转换为对象的实际类型

时间:2010-02-16 17:19:28

标签: c# sharepoint casting

我正在做的是查找哈希表中特定字段的值。该对象可以是少数原始类型,它们的值注定要放在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();
            }
            ...
        }

5 个答案:

答案 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)

根据您的可接受类型列表,您可能需要考虑使用Convert.ToString和/或IConvertable interface

这将允许您一次性处理大多数基本类型。

但是,您仍然需要处理空检查。

答案 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是值类型。)