[リフレクション] すべてのメンバを取得する

スポンサーリンク

すべてのメンバを取得するにはTypeクラスの GetMembersメソッドを使用します。

ここでの「すべてのメンバ」とは、メソッド、プロパティ、フィールドなどを指します。

例えば、以下のようなTestClassというクラスがあるとします。

VBの例

Public Class TestClass
    ' フィールド
    Private _testProperty As String

    ''' <summary>
    ''' コンストラクタ
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()

    End Sub

    ''' <summary>
    ''' プロパティ
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property TestProperty() As String
        Get
            Return _testProperty
        End Get
        Set(ByVal value As String)
            _testProperty = value
        End Set
    End Property

    ''' <summary>
    ''' メソッド
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function TestMethod() As Boolean
        Return True
    End Function
End Class

C#の例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace ReflectionCS
{
    class TestClass
    {
        // フィールド
        private string _testField = string.Empty;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public TestClass()
        {

        }

        /// <summary>
        /// プロパティ
        /// </summary>
        public string TestProperty
        {
            get
            {
                return _testField;
            }
            set
            {
                _testField = value;
            }
        }

        /// <summary>
        /// メソッド
        /// </summary>
        /// <returns></returns>
        public bool TestMethod()
        {
            return true;
        }
    }
}

上記クラスのメンバ情報を取得するには、以下のようなコードを書きます。

VBの例

Sub Main()

    Dim t As Type = GetType(ReflectionVB.TestClass)

    'メンバを取得する
    Dim members As MemberInfo() = t.GetMembers( _
        BindingFlags.Public Or BindingFlags.NonPublic Or _
        BindingFlags.Instance Or BindingFlags.Static Or _
        BindingFlags.DeclaredOnly)

    For Each m As MemberInfo In members
        Console.WriteLine("{0}", m.Name)
    Next


    Console.ReadLine()
End Sub

C#の例

static void Main(string[] args)
{
    ////TestClass tc = new TestClass();
    ////tc.DispInfo();
    //var asm = Assembly.GetExecutingAssembly();

    //// アセンブリのバージョンを取得
    //var version = asm.GetName().Version;

    //Console.WriteLine(version);

    Type type = typeof(ReflectionCS.TestClass);

    //メンバを取得する
    MemberInfo[] members = type.GetMembers(
        BindingFlags.Public | BindingFlags.NonPublic |
        BindingFlags.Instance | BindingFlags.Static |
        BindingFlags.DeclaredOnly);

    foreach (MemberInfo mb in members)
    {
        Console.WriteLine("{0}", mb.Name);
    }

    Console.ReadLine();
}

GetMembersのメソッドに指定可能な BindingFlagsは以下の通りです。
この BindingFlagsにより、取得したいメンバを決定することができます。

メンバ説明
Publicパブリックメンバ
NonPublic非パブリックメンバ
Instanceインスタンスメンバ
Static静的メンバ
DeclaredOnly継承メンバーを除外

実行例は以下の通りです。

実行例

実行例の

get_TestProperty、set_TestPropertyはプロパティ内にあるゲッターとセッターを表しています。

TestMethodは、クラス内にあるメソッド名です。

.ctorというのは、コンストラクタです。

TestPropertyは、クラス内にあるプロパティ名です。

_testPropertyは、クラス内にあるフィールドです。

このように、GetMembersメソッドを使用することで、すべてのメンバーを取得することができます。

最後に、メンバーのタイプも表示するようにコードを修正してみましょう。

For Each(C#はforeach)を以下のように書き換えてください。

m.MemberTypeがメンバーのタイプを表します。

VBの例

For Each m As MemberInfo In members
    Console.WriteLine("{0}:{1}", m.MemberType, m.Name)
Next

C#の例

foreach (MemberInfo mb in members)
{
    Console.WriteLine("{0}:{1}", mb.MemberType, mb.Name);
}

実行例は以下の通りです。

実行例

Please follow and like us:

コメント

タイトルとURLをコピーしました