2017-10-06 2 views
4

Existe-t-il un moyen de vérifier si un objet est un type d'enregistrement F # à l'exécution en C# sans faire référence à la bibliothèque FSharp.Core?Détection du type d'enregistrement F # à partir de C# à l'exécution

+0

Pourquoi ne pas simplement référencer 'FSharp.Core'? – scrwtp

+0

L'ajout d'une dépendance à une bibliothèque pour une seule et même fonction est excessif et gonfle l'arborescence des dépendances d'une autre bibliothèque. –

+0

C'est vrai, mais si vous vous souciez déjà de reconnaître les enregistrements F #, vous pourriez vouloir cette dépendance de toute façon. – scrwtp

Répondre

6

Les types d'enregistrement sont marqués avec l'attribut [<CompilationMapping(SourceConstructFlags.RecordType)>] lors de la compilation. C'est ce que recherche FSharpType.IsRecord, vous pouvez voir la mise en œuvre here. Les syndicats discriminés sont marqués de la même manière.

Il est possible de réimplémenter cette logique sans faire explicitement référence aux types FSharp.Core, c'est-à-dire que vous pouvez rechercher l'attribut par son nom et avoir votre propre copie de SourceConstructFlags enum pour les données d'attribut correspondantes.

+0

Je suis essentiellement arrivé à cette conclusion. Je me demandais plus ou moins si cela avait déjà été fait par quelqu'un. Merci! –

+0

Considérant combien il est rare de consommer une bibliothèque F # sans faire référence à FSharp.Core, je suppose que les gens utilisent juste FSharpType.IsRecord. – Tarmil

+1

@Tarmil: C'est certainement vrai, même Newtonsoft.Json (que j'ai supposé avoir réimplémenté une partie de la logique 'FSharp.Core' pour éviter d'avoir une dépendance) charge effectivement' FSharp.Core' dynamiquement pour réutiliser le code de réflexion, voir [ici ] (https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Utilities/FSharpUtils.cs). – scrwtp