2013-07-09 72 views
0

我有一個類,其中一個財產返回List<object>。在該列表中,我放置了一組匿名對象。使用匿名對象+動態是不明智的嗎?

然後,我有一個循環使用該屬性的項目作爲動態變量。
所以我的代碼如下所示:

private List<object> BookerTypes 
{ 
    get 
    { 
     if (this.bookerTypes == null) 
     { 
      this.bookerTypes = new List<object>(); 

      var com = new SqlConnection(functions.ConnectionString).CreateCommand(); 
      com.CommandText = @" 
SELECT 
    BT.id 
    , BT.name 
FROM dbo.BookerTypes AS BT 
ORDER BY BT.name ASC 
"; 
      com.Connection.Open(); 
      try 
      { 
       using (var dr = com.ExecuteReader()) 
       { 
        while (dr.Read()) 
        { 
         this.bookerTypes.Add(new { id = dr.GetInt32(0), name = dr.GetString(1) }); 
        } 
       } 
      } 
      finally 
      { 
       com.Connection.Close(); 
      } 
     } 

     return this.bookerTypes; 
    } 
} 

[...]

this.cblSBT.Items.Clear(); 
    foreach(dynamic bt in this.BookerTypes) 
    { 
     this.cblSBT.Items.Add(new ListItem() 
     { 
      Value = bt.id.ToString() 
      , Text = bt.name 
      , Selected = this.competition.SubscriptionTypes.Contains((int)bt.id) 
     }); 
    } 
從明顯失去了強類型的類型

除此之外,沒有任何理由,我不應該這樣做呢?

+0

可讀性,也許? –

+0

想象一下,從另一個開發者那裏繼承你的代碼,你將不得不搜索來找出實際的類型 – Sayse

回答

3

不這樣做的主要原因是,正如你所說,你已經失去了你的靜態類型。還有與此相關的性能成本,但它們不如這個代碼在可讀性和可維護性方面存在的問題那麼重要。

如果您發現拼寫錯誤或錯誤輸入了變量名稱,您將無法進行編譯時檢查(並且無需代碼完成支持就可以輕鬆完成)。在編譯時,你也沒有任何有效的方法知道你給出的List<object>中可能存在哪些變量。查找該列表的來源以找出可能使用哪些變量成爲一項不重要的任務。

在這種情況下,創建新的命名類型而不是使用匿名類型幾乎肯定值得花時間和精力。創建新班級的小前期成本實際上總是會有所回報。

+0

我不會說可讀性是一個問題。 – James

+0

@James然後隨意發佈另一個答案,指出什麼,如果有的話,你覺得*是給定代碼的問題。 – Servy

+0

我正在寫一個答案,但你幾乎涵蓋了我所關心的問題 - 類型安全性的損失和一般使用'dynamic'的脆弱性(簡單的拼寫錯誤等)。只要補充一點,國際海事組織,我不認爲可讀性會丟失,因爲這些屬性等可以清楚地看到。 – James

1

在類型安全性損失&之上的其他問題已經被指出,我覺得在這裏使用dynamic顯然是錯誤的。

dynamic的一般用例用於從外部來源消耗數據,例如, API/COM等基本情況下,信息類型尚未明確定義。在你的場景中,你可以控制你所要求的數據,並且你知道類型的數據的期望值,因此我不能證明你爲什麼要使用它來獲得明確定義的類型 - 安全模型。

使用匿名對象+動態是不明智的嗎?

在你的情況下,我會認爲是。

+0

匿名類型是fum! :D(易寫) – Serge

+0

這要看。當你「生成」一些真正特定的數據時,只要在你使用它的代碼上面幾行,你就會獲得時間(否則我們就不會使用匿名類)。在這種情況下,對於「少數」行來說還有一點點,所以這次我不會使用動態+匿名。 – Serge

+0

@Serge是的,我同意在類型安全性不重要時用於臨時存儲。 – James