2016-12-21 23 views
6

Với hai Công đoàn bị phân biệt đối xử này, tôi muốn lấy số DeclaringType từ một ví dụ cụ thể.Làm thế nào để bạn có được Loại Liên minh Phân biệt đối xử từ một cá thể Trường hợp?

type SingleCaseUnion = 
    | One 

type MultiCaseUnion = 
    | Two 
    | Three 

Một ví dụ cho từng trường hợp sẽ như sau:

getDiscriminatedUnionType One = typeof<SingleCaseUnion> // true 

getDiscriminatedUnionType Three = typeof<MultiCaseUnion> // true 

nỗ lực đầu tiên của tôi là để có được các loại vụ án và nhận được đó là lớp cơ sở, công trình này bởi vì trong F # một subtype là được tạo cho từng trường hợp.

MultiCaseUnion.Two.GetType().BaseType = typeof<MultiCaseUnion> // true 

Tuy nhiên, đối với một trường hợp đơn lẻ, điều này không hoạt động vì không có loại lồng nhau nào được tạo.

SingleCaseUnion.One.GetType().BaseType = typeof<SingleCaseUnion> // false 

nỗ lực thứ hai của tôi, mà nhằm mục đích để có được một giải pháp mạnh mẽ hơn là sử dụng người giúp Reflection FSharp.

FSharpType.GetUnionCases(unionValue.GetType()).First().DeclaringType 

Điều này làm việc cho mọi trường hợp nhưng phải tạo ra các trường hợp UnionCaseInfo cho từng trường hợp có vẻ hơi không cần thiết.

Có điều gì đó được xây dựng mà tôi có thể đã bỏ lỡ không? Một cái gì đó như:

FSharpValue.GetUnionFromCase(SingleCaseUnion.One) 

Trả lời

4

Làm thế nào về

open FSharp.Reflection 
type FSharpType = 
    static member GetUnionType t =   
     let ownType = t.GetType() 
     assert FSharpType.IsUnion(ownType) 
     let baseType = ownType.BaseType   
     if baseType = typeof<System.Object> then ownType else baseType 

Test:

(FSharpType.GetUnionType MultiCaseUnion.Three).Name //MultiCaseUnion 

(FSharpType.GetUnionType SingleCaseUnion.One).Name //SingleCaseUnion 
+0

Đó có lẽ là giải pháp tốt nhất vào lúc này. Tuy nhiên, nó không yêu cầu loại là một Liên minh phân biệt đối xử. –

+0

AFAIK, không có cách nào để hạn chế loại công đoàn. Thêm vào như là xác nhận mặc dù. – Asti

Các vấn đề liên quan