2

タイプ「フィールド」のいくつかのパブリックプロパティを持つチケットと呼ばれるVB.NETクラスがあります。これらすべてのプロパティを (for each を使用して) 反復処理し、それぞれに対して特定のタスクを実行できる方法が必要です。おそらく最良の方法は、リスト(フィールドの)を作成し、リストにそのクラスの「フィールド」プロパティを入力することだと思いました。どうすればよいかわからないのは、プロパティをリストに動的に取得することです。これにより、将来プロパティを追加する場合に手動でリストに入力する必要がなくなります。これを行う方法について何か考えはありますか?リフレクションの使用例を検索してみましたが、プロパティ自体ではなく、プロパティの名前を取得する方法しかわかりませんでした。

クラスの例を次に示します。

Public Class ticket
    Public Property location As New field
    Public Property user As New field
    Public Property callType As New field
    Public Property dateOfCall As New field
    Public Property tech As New field
    Public Property description As New field

    Public Property myFields As New List(Of field)

'What if field had a property of value and I wanted to increment all of the fields    in this class by one

Public Sub plusOne()
    For Each x As field In myFields()
        x.value += 1
    Next
End Sub

End Class
4

3 に答える 3

4

Reflectionを使用したいとします。これは、アセンブリ内の型を検査することを意味します。System.Reflection名前空間を介してこれを行うことができます。

VB.Net でのリフレクションの例については、msdn マガジンの次の記事を参照してください: http://msdn.microsoft.com/en-us/magazine/cc163750.aspx

その記事の型のメンバーを反復処理する例は次のとおりです。

Dim t As Type = GetType(AcmeCorp.BusinessLogic.Customer)
For Each member As MemberInfo In t.GetMembers
  Console.WriteLine(member.Name)
Next
于 2012-11-09T13:53:23.550 に答える
0

前の回答と同じように、リフレクションを使用します。の例として呼び出すには、AddこれList(Of T)を行います。

Public Class Test
  Public Property SomeList As List(Of String)
End Class

次に、次のコードを使用して add を呼び出しますList(Of String)

Dim pi As PropertyInfo = GetType(Test).GetProperty("SomeList")
Dim mi As MethodInfo = GetType(List(Of String)).GetMethod("Add")
Dim t As New Test()
t.SomeList = New List(Of String)
mi.Invoke(pi.GetValue(t, Nothing), New Object() {"Added through reflection"})
于 2012-11-09T14:50:20.983 に答える
0

前の回答で述べたように、System.Reflection を使用してクラスのプロパティを取得する必要があります。次に、プロパティが目的のタイプであることを確認します。

うまくいけば、これはあなたが望むものを与えるはずです。コードを実行すると、指定されたタイプのプロパティのみが取得されることがわかります。すべてのプロパティが必要な場合は、for each ループの where ステートメントを削除します。

Imports System.Reflection

Module Module1

Sub Main()

    ' Create a list to hold your properties
    Dim myList As New List(Of MyProperty)

    ' check each property for its type using the where statement below. Change integer to "Field" in your case
    For Each el In GetType(Test).GetProperties.Where(Function(p) p.PropertyType = GetType(Integer))
        ' add each matching property to the list
        myList.Add(New MyProperty With {.Name = el.Name, .GetMethod = el.GetGetMethod(), .SetMethod = el.GetSetMethod()})
        Console.WriteLine(el.Name & " has been added to myList")
    Next

    Console.Read()
End Sub

Public Class MyProperty
    Public Property Name As String
    Public Property GetMethod As MethodInfo
    Public Property SetMethod As MethodInfo
End Class

Public Class Test
    Private var1 As String
    Private var2 As String
    Private var3 As String
    Private var4 As String

    Public Property myInt1 As Integer
    Public Property myInt2 As Integer
    Public Property myInt3 As Integer
    Public Property myInt4 As Integer
End Class
End Module

それが役立つことを願っています

于 2012-11-09T16:52:04.633 に答える