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

すべてのメンバを取得するには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);
}

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

実行例

[リフレクション] アセンブリのバージョンを取得する

アセンブリのバージョンを取得するには

  1. Assembly.GetExecutionAssemblyでアセンブリ情報を取得する
  2. 1.で取得したアセンブル情報の GetNmaeメソッドが返す Version情報を参照する

という手順で行います。

以下にコード例を示します。

VBの例

Imports System.Reflection

Module Module1

    Sub Main()
        Dim asm = Assembly.GetExecutingAssembly()
        ' アセンブリのバージョンを取得
        Dim version = asm.GetName().Version

        Console.WriteLine(version)

        Console.ReadLine()
    End Sub

End Module

C#の例

using System.Reflection;

namespace ReflectionCS
{
    class Program
    {
        static void Main(string[] args)
        {
            var asm = Assembly.GetExecutingAssembly();

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

            Console.WriteLine(version);

            Console.ReadLine();
        }
    }
}

以下に実行例を示します。

実行例

[リフレクション] アセンブリ名を取得する

アセンブリ名を取得するには GetTypeメソッドが返す、Assemblyプロパティを使用します。

AssemblyプロパティのLocationプロパティには、アセンブリのフルパスが格納されています。

PathクラスのGetFileNameメソッドを使用すれば、アセンブリのフルパスからアセンブリ名のみを取得することができます。

VBの例

Public Class TestClass
    Public Function DispInfo() As Integer
        'アセンブリ名をフルパスで取得
        Dim fullAssemblyNmae = Me.[GetType]().Assembly.Location
        'アセンブリ名のみを取得
        Dim assemblyName = System.IO.Path.GetFileName(fullAssemblyNmae)

        Console.WriteLine(fullAssemblyNmae)
        Console.WriteLine(assemblyName)

        Return 0
    End Function
End Class

C#の例

namespace ReflectionCS
{
    class TestClass
    {
        public int DispInfo()
        {
            // アセンブリ名をフルパスで取得
            var fullAssemblyNmae = this.GetType().Assembly.Location;
            // アセンブリ名のみを取得
            var assemblyName = System.IO.Path.GetFileName(fullAssemblyNmae);

            Console.WriteLine(fullAssemblyNmae);
            Console.WriteLine(assemblyName);

            return 0;
        }
    }
}

以下にコード例を示します。

実行例