2016-03-01 24 views
9

Aşağıdaki kod parçasına bakalım ve hem MyAttribute hem de test işlevinin değiştirilemeyeceğini varsayalım.Enum değeri nasıl korunur

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) 

sanırım (herhangi bir yolu var mı enum türü hakkında bilgileri kaybolur ve öznitelik iletilen değerin sadece 2.

olduğunu test dönüş B ama 2. Oluşturulan IL kodu gösterir döndürür beklenebilir öznitelik değerindeki türü korumak için bazı öznitelikler olmalı? Nedir beklendiği gibi C# işlerinde daha ilginç eşdeğer kod

Eşdeğer C#:

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

gerçekleştirerek düzeltebilirsiniz. Bahsedilen C# kod eşdeğerini paylaşabilir misiniz? – MarcinJuraszek

+0

@MarcinJuraszek: düzenlenmiş – Novakov

+0

'GetCustomAttributes()' 'false 'ile F # ve' true' C#; Bunun ne olduğundan emin değil, ama en azından bir fark. – TeaDrivenDev

cevap

1

tahmin ediyorum ve derleyici iç donanım üzerinde bilgim sınırlı aslında sessiz ama bu bir ilgisi olduğunu tahmin sonuç çıkar. Int < -> Enum arasında bir eşdeğerlik var ve tür çıkarımının bunu mümkün olan en düşük türüne indirdiğinden şüpheliyim, bu durumda int. Bunu, aşağıdaki

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

Sorun şu ki, bu özelliği okumaktan sorumlu olan kodu değiştiremiyorum - enum hakkında hiçbir bilgisi olmayan başka bir kütüphanede – Novakov

İlgili konular