2012-11-09 119 views
1

我有一个名为ticket的VB.NET类,它有几个类型为'field'的公共属性。我想有一种方法可以遍历所有这些属性(每个属性都有一个),并对每个属性执行特定的任务。我认为也许最好的方法是创建一个列表(字段),并用该类的'field'属性填充列表。我不知道该怎么做是将属性动态添加到列表中,以便在将来添加属性时不必手动将它们输入到列表中。有关我如何做这件事的任何想法?我尝试搜索并找到了一些使用反射的例子,但我只能弄清楚如何得到属性的名称而不是属性本身。通过类属性迭代

这里是一个类的实例:

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 

回答

3

你想用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 
+0

我将如何实现像names.add(成员)?还是我以错误的方式接近这个? – donL

0

再次作为以前的答案 - 你会使用反射。以List(Of T)作为例子Add我会这样做。

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

然后使用下面的代码来调用添加在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"}) 
0

正如前面回答说,你需要使用的System.Reflection来获取类的属性。然后检查属性是你想要的类型。

希望这应该给你你想要的。如果您运行代码,您将看到它只接受指定类型的属性。如果您想拥有所有属性,请删除每个循环的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 

希望帮助

+0

纠正我,如果我错了,但这会创建一个重复对象不一样的列表。所以如果我为每一个修改了列表中的每个测试,我不会修改该类的实例的属性。 – donL

+0

完全脱离了我的头顶,但它应该起作用,因为课堂上持有参考资料。您可以通过将上面的代码转储到控制台应用程序来尝试。我不能做atm,否则会为你验证身份 –