2012-02-16 62 views
1

最近我一直在探索使用C#4.0(DynamicObject,ExpandoObject等)中引入的花哨的新動態關鍵字。動態運行時對象創建:保持智能感知?

現在我可以確定新引入的幾種用法(和幾個陷阱),但爲了我的項目和這個問題 - 我正在清理我的後期綁定的基於字符串的索引集合,以使它們更安全。

因此,動力之前,我有:

Car car1 = CARWarehouse1["Honda"]; 

,並與動態我現在可以做(其中CARWarehouse1現在擴展的DynamicObjects基地)

Car car1 = CARWarehouse1.Honda 

這是一切都很好,並從快速瀏覽它看起來像我已經達到了我想要的......但是我有嗎? 因爲讓我們面對它,對於編譯時的任何一種方法,如果我輸錯了我引用的汽車類型,編譯器不會有問題,但我會在運行時遇到問題。

因此,我真正需要的是編譯時屬性檢查和Intellisense支持。所以 - 我能做到嗎?

我知道有像Moq這樣的庫有這種能力,並且Resharper在intellisense中提供了某種支持,但我正在尋找一個更全面的解決方案。

歡迎任何想法,大,小,簡單或複雜。

+2

您的CARWarehouse1(奇數大寫的btw)*在編譯時知道它有一個'Honda'而不是'Honder'?如果不是,編譯器如何抱怨?如果是這樣,爲什麼你不使用靜態類型? – 2012-02-16 11:35:24

+0

是的,這個項目並沒有真正使用CARWarehouse1,它只是一個例子,Cars會在運行時通過數據庫或者XML或者其他方式被添加到CarWarehouse中,我不希望汽車被強制輸入。我明白你的意思,但我希望intellisense能夠實際運行該方法並返回動態屬性。我很高興看到代碼生成路線,就像linq實體一樣。我只想知道什麼是可能的 – 2012-02-16 11:43:16

+1

它會查找哪個數據庫?你的製作嗎?測試?還有別的嗎?你在編譯時真的需要數據庫調用嗎?那麼如果你不在一個有數據庫的網絡上......想想所有可能出錯的地方...... – 2012-02-16 11:47:42

回答

4

不,沒有這樣的動態類型的東西。

基本上編譯器只是跳過所有標記爲dynamic的變量的檢查,因爲沒有辦法檢查任何東西。動態對象的屬性可能會在運行時創建,因此無法在編譯時檢查代碼的準確性。

+0

可悲的是,他們應該考慮支持評論中的註釋來告訴intellisense .... PHP也會做類似的事情...... – 2012-03-22 21:41:11

1

如果編譯時間檢查和智能感知很重要,請不要使用dynamic。如果對象的範圍很小,則可以使用匿名類型,但我沒有得到適用於您的情況的印象。我建議你只是定義你需要的類型,並且堅持使用字典和哈希表來表示編碼時無法預測的任何屬性。