2009-06-02 21 views
8

Bir giriş dosyasında aldığım anlamsız kod değerlerini temsil etmek için anlamlı değişken adlarını tuttuğum bir dizi statik "numaralandırma" sınıfı var. İşte bir örnek.Yansımayı kullanarak bir türün statik alan değerlerini alma

Public Class ReasonCodeValue 
    Private Sub New() 
    End Sub 
    Public Shared ReadOnly ServiceNotCovered As String = "SNCV" 
    Public Shared ReadOnly MemberNotEligible As String = "MNEL" 
End Class 

Bunları statik sınıflardan birinin türünü ve bir dize değeri kabul etmek ve değer statik alan değerlerden biri olup olmadığını belirleyecek bir yöntem yazmak istiyorum. Belirli bir nesne için örnek alanlarının nasıl alınacağını biliyorum ve belirli bir tür için statik alanların bir listesini nasıl alacağımı biliyorum; Benim anlayamadığım şey, statik alan değerlerinin bir örnek olmadan nasıl elde edileceğidir. Şimdiye kadar sahip olduğum şeyler.

Public Function IsValidValue(ByVal type As Type, ByVal value As String) As Boolean 
    Dim fields = type.GetFields(BindingFlags.Public Or BindingFlags.Static) 
    For Each field As FieldInfo In fields 
     DoSomething() 
    Next 
End Function 

ben sadece bu yüzden benim doğrulama yöntemi içinde FieldInfo.GetValue geçmek bir örneğini oluşturabilir numaralandırma sınıflarını statik olmayan yapabilir gerekiyordu. Sınıfımı, yapabilseydim tutmayı tercih ederim.

GetRawConstantValue adlı bir yöntem görüyorum. Tehlikeli görünüyor. Bana ne aradığımı verecek mi? Başka fikirlerin var mı?

cevap

24

Çağrı

field.GetValue(Nothing) 

ve iyi olacak. Statik üyeler için bir örneğe ihtiyacınız yok.

'u düşünmüyorumGetRawConstantValue istediğin şey - Yukarıdaki koda bağlıyım.

+1

Hey, sen benim için VB'ye koydun. Asla boşa geçmeyi düşünmemiştim. Teşekkürler. –

+0

VB'de bir soru sorun ve VB'ye cevap vermeye çalışacağım. Bazen çok yanlış gidiyor, ama bu durumda çok zor değildi :) –

+13

Başka bir JS gerçeği: Jon Skeet cevaplarını evrensel bir IL olarak hesaplar ve daha sonra uygun kaynak koduna çevirir ... –

3

daha büyük anlamda yapmaya çalıştığımız şey baktığımızda, belki bu daha iyi bir uyum olacaktır: tam olarak eşleşir intellisense destek almak için size mümkün olabilir bu bağlantıyı kullanarak sonra

Public Interface ICustomEnum(Of T) 
    Function FromT(ByVal value As T) As ICustomEnum(Of T) 
    ReadOnly Property Value() As T 

    ''// Implement using a private constructor that accepts and sets the Value property, 
    ''// one shared readonly property for each desired value in the enum, 
    ''// and widening conversions to and from T. 
    ''// Then see this link to get intellisense support 
    ''// that exactly matches a normal enum: 
    ''// https://stackoverflow.com/questions/102084/hidden-features-of-vb-net/102217#102217 
End Interface 

' 
''' <completionlist cref="ReasonCodeValue"/> 
Public NotInheritable Class ReasonCodeValue 
    Implements ICustomEnum(Of String) 

    Private _value As String 
    Public ReadOnly Property Value() As String Implements ICustomEnum(Of String).Value 
     Get 
      Return _value 
     End Get 
    End Property 

    Private Sub New(ByVal value As String) 
     _value = value 
    End Sub 

    Private Shared _ServiceNotCovered As New ReasonCodeValue("SNCV") 
    Public Shared ReadOnly Property ServiceNotCovered() As ReasonCodeValue 
     Get 
      Return _ServiceNotCovered 
     End Get 
    End Property 

    Private Shared _MemberNotEligible As New ReasonCodeValue("MNEL") 
    Public Shared ReadOnly Property MemberNotEligible() As ReasonCodeValue 
     Get 
      Return _MemberNotEligible 
     End Get 
    End Property 

    Public Shared Function FromString(ByVal value As String) As ICustomEnum(Of String) 
     ''// use reflection or a dictionary here if you have a lot of values 
     Select Case value 
      Case "SNCV" 
       Return _ServiceNotCovered 
      Case "MNEL" 
       Return _MemberNotEligible 
      Case Else 
       Return Nothing ''//or throw an exception 
     End Select 
    End Function 

    Public Function FromT(ByVal value As String) As ICustomEnum(Of String) Implements ICustomEnum(Of String).FromT 
     Return FromString(value) 
    End Function 

    Public Shared Widening Operator CType(ByVal item As ReasonCodeValue) As String 
     Return item.Value 
    End Operator 

    Public Shared Widening Operator CType(ByVal value As String) As ReasonCodeValue 
     Return FromString(value) 
    End Operator 
End Class 

Ve Normal bir enum:
Hidden Features of VB.NET?

+0

Joel, bu tam cevap 935544 (ve şimdiki soru için çok iyi bir cevap) sorusu üzerine arıyorum. Bu soruya bu cevabın bir bağlantısıyla cevap verebilseydiniz, bu yararlı olurdu. Ekstra bilgi için teşekkürler. Gizli özellikler linki mükemmel. –

+0

hepsi bitti. –

İlgili konular