2010-02-16 41 views
5

我在做什麼是查找散列表中特定字段的值。該對象可以是少數基本類型,它們的值將注入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(); 
      } 
      ... 
     } 

回答

8

如果你正在做的是呼籲ToString,由於C#的多態性質,將調用toString,正確執行,即使你已經是對對象的引用。

例如爲:

var d=DateTime.Now; 
object od=d; 
Console.WriteLine(od.ToString()); 
Console.WriteLine(d.ToString()); //same as previous line 
+1

這適用於基本類型,但可能不適用於自定義類型 - 取決於可以在項[columnName]中返回的內容... – 2010-02-16 17:24:57

+0

裏德,你能舉個例子嗎? – spender 2010-02-16 17:26:07

+0

我真的不認爲這會工作。因此,出於參數的原因,如何在特定類型的繼承樹上顯式調用ToString實現? – 2010-02-16 17:27:01

1

根據您接受的類型的列表中,你可能要考慮使用Convert.ToString和/或IConvertable interface

這將允許您在一次處理中處理大多數基元類型。

但是,您仍然需要處理您的空檢查。

0

爲什麼你就不能使用在value的ToString()以來的ToString()從對象繼承?繼承鏈中的適當類型的.ToString()將被調用。

+0

儘管如此,仍然需要空檢查。 – 2010-02-16 17:24:21

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!"; 
     } 
    } 

現在MYTYPE將與GetColumnValue下面的工作,如果你改變的ToString()來MyToString()

原帖

這將做你想做的。

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宏...

+1

方法名稱解析規則要求優先選擇對象的成員方法,而不是可能在範圍內的任何擴展方法。所以我很確定你在這裏提出的建議是行不通的。 – 2010-02-16 18:19:01

+0

是的,我剛剛測試過,我正在閱讀的這本書暗示它會像我描述的那樣行事,我將答案改爲新的解決方案。 – Hogan 2010-02-16 18:38:12

0

ToString()是一個虛擬的方法。這意味着,該方法的任何調用會在運行時,選擇正確的實現(「最派生類型」)。由於所有的靈長類動物的種類覆蓋ToString()做正確的事,沒有理由對任何鑄造於任何類型的變量。

對於虛擬方法,變量的類型在選擇正確的實現中並不重要。所有重要的是被引用的對象的運行時類型。

int x = 10; 
object o = x; 
x.ToString(); 
o.ToString(); 

ToString()兩種電話將執行相同的代碼(減去發生在object版本的開箱,由於int是值類型)。

相關問題