2017-10-06 11 views
4

実行時にオブジェクトがFSharp.Coreライブラリを参照せずにC#レコードタイプであるかどうかをチェックする方法はありますか?実行時にC#からF#レコードタイプを検出する

+0

「FSharp.Core」を参照するだけではどうですか? – scrwtp

+0

基本的に1つの関数のライブラリに依存関係を追加すると、別のライブラリの依存関係ツリーが壊れてしまいます。 –

+0

これは当てはまりますが、すでにF#レコードの認識に気を配っていれば、とにかくその依存関係が必要な場合があります。 – scrwtp

答えて

6

レコードタイプは、編集時に[<CompilationMapping(SourceConstructFlags.RecordType)>]属性でマークされます。これはFSharpType.IsRecordが探しているものです。実装はhereです。差別化された組合も同様の方法でマークされます。

FSharp.Coreタイプを明示的に参照することなくそのロジックを再実装することができます。つまり、名前で属性を検索し、一致する属性データにSourceConstructFlagsという独自のコピーを持つことができます。

+0

私は基本的にこの結論に達しました。これはすでに誰かによって行われたかどうか私は多かれ少なかれ疑問に思った。ありがとう! –

+0

FSharp.Coreを参照せずにF#ライブラリを消費することはまれであると考えて、人々は単に 'FSharpType.IsRecord'を使うと仮定します。 – Tarmil

+1

@Tarmil:これは確かです.Newtonsoft.Json(依存関係を避けるために 'FSharp.Core'ロジックのいくつかを再実装したと仮定しています)は実際にリフレクションコードを再利用するために' FSharp.Core'を動的にロードします。 ](https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Utilities/FSharpUtils.cs)。 – scrwtp

関連する問題