2017-10-06 46 views
4

有沒有辦法在C#中運行時檢查對象是否爲F#記錄類型,而無需引用FSharp.Core庫?在運行時從C#中檢測F#記錄類型

+0

爲什麼不引用'FSharp.Core'? – scrwtp

+0

因爲基本上爲一個函數添加一個依賴關係到庫是矯枉過正的,並且膨脹了另一個庫的依賴關係樹。 –

+0

的確如此,但如果您已經在意識別F#記錄,那麼無論如何您都可能需要該依賴項。 – scrwtp

回答

6

記錄類型在編譯時被標記爲[<CompilationMapping(SourceConstructFlags.RecordType)>]屬性。這是FSharpType.IsRecord尋找的內容,可以看到執行here。歧視的工會以類似的方式得到標記。

可以在不明確引用任何FSharp.Core類型的情況下重新實現該邏輯,也就是說,您可以按名稱查找屬性,並擁有您自己的SourceConstructFlags enum副本以查找匹配的屬性數據。

+0

我基本上得出這個結論。我或多或少想知道這是否已經被某人完成了。謝謝! –

+0

考慮到在不引用FSharp.Core的情況下使用F#庫是多麼罕見,我會假設人們只使用'FSharpType.IsRecord'。 – Tarmil

+1

@Tarmil:這當然是對的,甚至Newtonsoft.Json(我假設重新實現了一些'FSharp.Core'邏輯以避免依賴)實際上會動態加載'FSharp.Core'以重用反射代碼,請參閱[here ](https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Utilities/FSharpUtils.cs)。 – scrwtp