前回書いたように、PropertyGridコントロールは、Windowsの共通言語基盤(CLI)上の「.NETクラス階層内のすべてオブジェクト(Objectクラス)」を指定(PropertyGrid.SelectedObject | Objects)することにより、そのオブジェクトのプロパティ情報をリスト形式で表示するのみならず、それをユーザーが変更することで即時でプロパティの値を変更できました。
このCLIは共通言語仕様(CLS -Common Language Specifications)に基づいて(注1)作られているそうで、ObjectクラスがOOPの「何が、何時、何処で、どのように、どれだけ、何をする等」(注2)の情報の根本を定めていると思われます。
注1:もう一つ「共通型システム」(CTS - Common Type System)と呼ばれる「統一されたデータ型」にも準拠しなければならないようです。
注2:「何が」がフィールド、プロパティで、「何をする」がメソッドとしてお読みください。
従ってCLSに基づいて.NET上で作られたプログラム(これはCLI上で動く中間言語プログラム)は、VB.NET、C++やC#等、異なるプログラミング言語で書かれてもCLSの定める規則に沿って(OOPに則り)メンバー変数(フィールド)、メンバープロパティ、メンバー関数(メソッド)が配置されている(注)、ということになります。
注:結局は(CPUの管理するメモリー空間であれ、外部記憶装置のファイルの中であれ)「プログラムのどの場所に、どれだけの長さのメモリーをデータとして持ち、またそれら及びそれらを処理する関数のアドレスを配置しているかと」いうことになるかとおもいますが。
そんなことを考えて色々と当りを付けてみたら、矢張りObjectのメンバーを取得するメソッドがあることが判りました
ので、その紹介をさせていただきます。(It is more probable than not that PropertyGrid should use this method for its purpose!)
以下のテストプログラムはPropertyGridのメンバーを総て拾って表示します。
【TestGetMembers.cs】
//////////////////////////////
// TestGetMembers.cs
// Check the members of Object
//////////////////////////////
using System;
using System.Windows.Forms;
using System.Reflection; //GetMembersメソッドを使う為に必要
namespace TestGetMembers
{
public class Sample
{
public static void Main()
{
//PropertyGridクラスのTypeを指定する
Type t = typeof(System.Windows.Forms.PropertyGrid);
//PropertyGridクラスのType tのメンバー情報を取得する
/* BindingFlags
メンバ名 説明(値)
Public パブリックメンバを検索の対象に加える。(16)
NonPublic パブリックでないメンバを検索の対象に加える。(32)
Instance 非静的メンバ(インスタンスメンバ)を検索の対象に加える。(4)
Static 静的メンバを検索の対象に加える。(8)
DeclaredOnly 継承されたメンバを検索の対象にしない。(2)
FlattenHierarchy 階層構造の上位の静的メンバを検索の対象に加える。(64)
*/
MemberInfo[] members = t.GetMembers(BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.Static |
BindingFlags.DeclaredOnly);
foreach (MemberInfo m in members)
{
//メンバーの型と名前を表示する
Console.WriteLine("{0} - {1}", m.MemberType, m.Name);
}
Console.Read();
}
}
}
如何でしょうか?最初に「Method」がダーッと並び、次に「Constructor、「Porperty」「Field」「NestedType(注)」へとズラズラと並びますね。
注:クラス、構造体、インターフェィス等のことです。
何れにせよ、CLIで動くCLSに準拠したObjectはそのまま、Win32API等で動く旧いプログラム等もその情報を取得してObject化すればPropertyGridで表示ができることが判りました。
で?
次回に続く。
