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に指示するバインディングフラグと呼ばれるものを指定することもできます。 BindingFlags列挙。この図では、A0-A999プロパティがパブリックであると宣言されていると仮定すると、BindingFlags.Publicで十分です。さらに多くのプロパティを公開するには、複数のBindingFlag値を論理「or」と組み合わせるだけです。

したがって、その情報を入手したら、クラスを作成し、そのプロパティを宣言し、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));
    }
}

そこにあります。これはVBではなくC#バージョンですが、一般的な概念はかなり簡単に翻訳できるはずです。お役に立てば幸いです。

于 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 に答える