2016-03-01 6 views
9

के कोड का निम्न भाग को देखो और लगता है कि दोनों MyAttribute और test समारोह बदला नहीं जा सकता हैं।enum में मान प्रकार संरक्षित करने के लिए कैसे

type MyAttribute() = 
    inherit Attribute() 

    let mutable prop = null 

    member this.Prop 
     with get(): obj = prop 
     and set(value) = prop <- value 


type MyEnum = 
    | A = 1 
    | B = 2 

[<My(Prop = MyEnum.B)>] 
type MyClass = class 
    end 

let test() = 
    let t = typeof<MyClass> 
    let a = t.GetCustomAttributes(false).[0] :?> MyAttribute 

    let e = a.Prop 
    Convert.ToString(e, Globalization.CultureInfo.CurrentCulture) 

मुझे लगता है कि test वापसी B लेकिन यह रिटर्न 2. जनरेट किया आईएल कोड पता चलता है कि enum प्रकार के बारे में जानकारी खो जाती है और विशेषता को भेजे गए मान सिर्फ 2.

है उम्मीद करेंगे वहाँ कोई तरीका है (मुझे लगता है कि यह विशेषता विशेषता में टाइप संरक्षित करने के लिए कुछ विशेषता होनी चाहिए? क्या सी # कार्यों में और अधिक दिलचस्प बराबर कोड अपेक्षित ढंग से

समतुल्य सी #:

class MyAttribute : Attribute 
{ 
    public object A { get; set; } 
} 

enum T { A,B,C } 

[My(A = T.A)] 
class MyClass 
{ } 

var a = typeof(MyClass).GetCustomAttributes(false)[0] as MyAttribute; 

Convert.ToString(a.A, System.Globalization.CultureInfo.CurrentCulture) 
+1

कर कर इसे ठीक कर सकते हैं क्या आप उल्लेख किए गए समकक्ष सी # कोड साझा कर सकते हैं? – MarcinJuraszek

+0

@MarcinJuraszek: संपादित – Novakov

+0

आप 'कॉल कर रहे हैं GetCustomAttributes()' 'सी # में एफ # में FALSE' और' TRUE' के साथ; सुनिश्चित नहीं है कि यह क्या करता है, लेकिन कम से कम यह एक अंतर है। – TeaDrivenDev

उत्तर

1

मेरा अनुमान है कि और संकलक के आंतरिक भागों पर मेरी जानकारी वास्तव में शांत सीमित हैं, लेकिन मुझे लगता है कि इस के साथ क्या करने के लिए कुछ है अनुमान टाइप करें। वहाँ पूर्णांक < के बीच एक समानक है -> Enum, और मुझे लगता है कि प्रकार निष्कर्ष इस मामले पूर्णांक में न्यूनतम मान प्रकार को यह कम करने है। आप निम्नलिखित

open System 

type MyAttribute() = 
    inherit Attribute() 

    let mutable prop = null 

    member this.Prop 
     with get(): obj = prop 
     and set(value) = prop <- value 


type MyEnum = 
    | A = 1 
    | B = 2 

[<My(Prop = MyEnum.B)>] 
type MyClass = class 
    end 

let test() = 
    let t = typeof<MyClass> 
    let a = t.GetCustomAttributes(false).[0] :?> MyAttribute 

    let e = a.Prop :?> MyEnum //Note 
    Convert.ToString(e, Globalization.CultureInfo.CurrentCulture) 
+0

समस्या यह है कि मुझे लगता है कि संपत्ति को पढ़ने के लिए कोड जिम्मेदार नहीं बदल सकते है - यह एक और पुस्तकालय जो मेरी enum के बारे में कोई ज्ञान नहीं है में है – Novakov

संबंधित मुद्दे