如果我有一个类对象A,它有a0,a1,a2等属性...如果这个类有100个这样的属性(最多为a99)。我想显示这些属性中的每一个,但我不希望有100行代码调用此代码
print A.a0
print A.a1
print A.a2
...
print A.a99
代码效率太低,所以我想知道是否有办法循环这些属性。谢谢。
答案 0 :(得分:1)
.NET提供了通过称为反射的过程在运行时检查对象的能力。原始帖子的目的是以自动方式迭代对象的属性,而不是通过手动编码显示每个属性的显式语句,而反射是完成此事的过程。
出于此特定目的,在运行时循环访问对象的属性,可以使用可用于每个Type的GetProperties()方法。在您的情况下,您要“反映”的类型是A,因此特定于类型的GetProperties版本返回该对象的实例属性列表。
当您要求.NET返回对象的属性时,您还可以指定所谓的绑定标志,它告诉.NET要返回哪些属性 - 公共属性,私有属性,静态属性 - BindingFlags枚举中大约20个不同值的无数组合。出于说明的目的,假设您的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,但我认为一般概念应该很容易翻译。我希望有所帮助!
答案 1 :(得分:0)
此MSDN代码示例说明了如何使用反射迭代类的属性:
答案 2 :(得分: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