2013-10-06 36 views
3

我正在研究在Fsharp中使用System.ComponentModel.Composition,並想知道是否可以在內存中動態生成判別聯盟?我想要DU是由導入類型的元素構建的。主要原因是我有一個DU的代碼,我認爲它最簡單的使用Composition。我完全準備接受這是錯誤的做法。是否有可能在fsharp中動態生成判別聯盟?

我已經使用了FSharpTypeFSharpValue來處理過去的各種事情,但它們似乎是在操縱現有的DU而不是創建新的DU。

我很抱歉地說,我還沒有'我試過這個'代碼示例,因爲我不知道從哪裏開始。

  • 可能嗎?
  • 這是可取的嗎?
  • 實際上我應該而不是使用DU來表示什麼來自Composition?
  • 我很高興使用反射,即使它有點慢。

編輯

  • 是否有可能/最好動態地添加到DU? (如果DU必須存在)
+0

這聽起來像是類型提供者的問題。 –

+0

我很好奇。一個「構圖」的類型提供者? – CodeBeard

+0

當您得到編譯時檢查和模式匹配時,IMO DU是很有用的。如果你的數據多種多樣,它可能需要很多不同類型/表示,這聽起來像是一個類型提供商的工作。 – Bala

回答

4

歧視工會的一大優點是編譯時已知可能情況的集合,所以編譯器可以告訴你你的代碼何時不處理可能的情況。這對重構有很大幫助,因爲您可以將新案例添加到現有的聯合中,並且編譯器會告訴您需要更改代碼中的哪些位置。

另一個好處是模式匹配歧視的工會語法優雅 - 你可以寫非常清晰的代碼。

從理論上講,您可能會動態生成一個使用Reflection.emit的DU,或者甚至可以將新的案例添加到現有的案例中。然而,上述兩個優點都不適用,所以我根本看不出使用它們的多少重點。

標準的繼承模型也是處理動態加載的插件IMO的正確方法。在每個插件所依賴的DLL中定義一個接口或公共基類,讓插件定義一個實現它的類,然後在插件上使用該接口/基類上的方法。

DU被設計爲預先固定可能/值/的集合,但是使任何人都可以輕鬆地在DU上編寫新的函數,而面向對象的繼承被設計用於修復可能的基本/函數/提前,但讓任何人都可以輕鬆添加新的價值。由於動態加載代碼都是關於添加新值的,所以我認爲這是非常合適的。

值得一提的是,DU實際上是使用F#編譯器的.NET繼承來實現的 - 有一個基類用於整個聯合類型,然後是每個聯合用例的單個派生類(儘管我認爲沒有參數的情況下專門治療)。

+0

嗨Ganesh,謝謝你的回答。我已經把這個作爲答案來展示,因爲它展示了我是如何試圖做錯事的。將以不同的模式前進。 :) – CodeBeard

相關問題