0

如果我有一个类对象 A,并且它具有诸如 a0、a1、a2 之类的属性...如果此类具有 100 个这样的属性(最多 a99)。我想显示这些属性中的每一个,但我不想有 100 行代码来调用它,如下所示

print A.a0
print A.a1
print A.a2
...
print A.a99

代码效率太低,所以我想知道是否有办法遍历这些属性。谢谢你。

4

3 回答 3

1

.NET 提供了通过称为反射的过程在运行时检查对象的能力。原始帖子的目的是以自动方式迭代对象的属性,而不是通过手动编码显示每个属性的显式语句,而反射就是完成这件事的过程。

出于这个特定目的,在运行时循环遍历对象的属性,您使用可用于每个类型的 GetProperties() 方法。在您的情况下,您要“反映”的类型是 A,因此 GetProperties 的特定类型版本返回该对象的实例属性列表。

当您要求 .NET 返回对象的属性时,您还可以指定所谓的绑定标志,它告诉 .NET 要返回哪些属性 - 公共属性、私有属性、静态属性 - 来自大约 20 个不同值的无数组合BindingFlags 枚举。出于本说明的目的,假设您的 A0-A999 属性已声明为公共,则 BindingFlags.Public 就足够了。要公开更多属性,只需将多个 BindingFlag 值与逻辑“或”组合。

所以,现在有了这些信息,我们需要做的就是创建一个类,声明它的属性,并告诉 Reflection 为我们枚举属性。假设您的 A 类存在且已定义属性名称 A0-A999,以下是您如何枚举以“A”开头的属性名称:

// Assuming Class "A" exists, and we have an instance of "A" held in 
// a variable ActualA...
using System.Reflection

// The GetProperties method returns an array of PropertyInfo objects...
PropertyInfo[] properties = typeof(ActualA).GetProperties(BindingFlags.Public);
// Now, just iterate through them.
foreach(PropertyInfo property in properties)
{
    if (property.Name.StartsWith("A")){
    // use .Name, .GetValue methods/props to get interesting info from each property.
        Console.WriteLine("Property {0}={1}",property.Name,
                                             property.GetValue(ActualA,null));
    }
}

你有它。那是 C# 版本而不是 VB,但我认为一般概念应该很容易翻译。我希望这会有所帮助!

于 2012-07-16T19:36:44.770 回答
0

创建一个 VB.Net 控制台应用程序,将此代码复制并粘贴到 Module1.vb 文件中并运行它。

Module Module1

    Sub Main()
        For Each prop In GetType(TestClass).GetProperties()
            Console.WriteLine(prop.Name)
        Next

        Console.ReadKey(True)
    End Sub

End Module

Public Class TestClass
    Private _One As String = "1"
    Public Property One() As String
        Get
            Return _One
        End Get
        Set(ByVal value As String)
            _One = value
        End Set
    End Property

    Private _Two As Integer = 2
    Public Property Two() As Integer
        Get
            Return _Two
        End Get
        Set(ByVal value As Integer)
            _Two = value
        End Set
    End Property

    Private _Three As Double = 3.1415927
    Public Property Three() As Double
        Get
            Return _Three
        End Get
        Set(ByVal value As Double)
            _Three = value
        End Set
    End Property

    Private _Four As Decimal = 4.4D
    Public Property Four() As Decimal
        Get
            Return _Four
        End Get
        Set(ByVal value As Decimal)
            _Four = value
        End Set
    End Property
End Class
于 2012-07-16T19:42:37.687 回答
0

此 MSDN 代码示例说明了如何使用反射迭代类的属性:

http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx#Y900

于 2012-07-16T19:36:08.087 回答