2009-06-02 12 views
8

私は入力ファイルで受け取った無意味なコード値を意味のある変数名として保持するために静的な "列挙"クラスを用意しています。ここに例があります。リフレクトを使用して型の静的フィールド値を取得する

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

私は、これらの静的クラスの一つの種類や文字列値を受け入れ、値が静的フィールドの値のいずれかであるかどうかを判断するメソッドを書きたいです。特定のオブジェクトのインスタンスフィールドを取得する方法を知っており、特定の型の静的フィールドのリストを取得する方法を知っています。私が理解できないことは、インスタンスなしで静的フィールド値を取得する方法です。これまでに私が得たことがここにあります。

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 

私はちょうどので、私は私の検証メソッド内FieldInfo.GetValueに渡すインスタンスを作成することができます非静的列挙クラスを作ることができるはず。もし私ができるならば、私はむしろクラスをそのままにしておきたい。

GetRawConstantValueというメソッドがあります。それは危険に見えます。それは私が探しているものを私に与えるだろうか?他のアイデア?

答えて

24

コール

field.GetValue(Nothing) 

、それは大丈夫です。静的メンバーのインスタンスは必要ありません。

私はだと思います。GetRawConstantValueは、上記のコードに固執します。

+1

ちょっと、私のためにVBに入れてください。決してnullを渡すことは考えられませんでした。ありがとう。 –

+0

VBで質問してください。私はVBで答えようとします。時々それは間違っていますが、この場合はそれほど難しくありません:) –

+13

JSの事実:Jon SkeetはユニバーサルILで彼の答えを計算し、それを適切なソースコードに変換します... –

3

あなたはおそらくこれは、より良いフィット感になり、より大きな意味で何をしようとしてを見て:あなたはまさにそれに一致するインテリセンスサポートを得ることができるかもしれない

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 

そして、このリンクを使用して通常の列挙型:
Hidden Features of VB.NET?

+0

Joel、これは私が質問935544で探している正確な答え(そして現在の質問についても非常に良い答えです)。あなたはこの答えにリンクしてその質問に答えることができれば、それは役に立ちます。追加情報をありがとう。隠された特徴のリンクは優秀である。 –

+0

がすべて完了しました。 –

関連する問題