クラスのフィールドの型の名前とフィールド名を取得する

実行時にクラスのフィールドの型を知りたい場合があります。たとえば、ある数値を示す文字列があって、その文字列を int.Parse() してフィールドに格納するか、double.Parase() して格納するか、そういう場合です。

いろいろな方法がMSDNで紹介されておりますが、一番簡単なのは下記に紹介するコードだと思います。

using System;

namespace aaa
{

	public class MyObject
	{

		public int       ValueI;
		public long      ValueL;
		public double    ValueD;
		public float     ValueF;
		public String    ValueS;
		public bool      ValueB;

		public MyObject()
		{
			ValueI = 123;
			ValueL = 456;
			ValueD = 7.89;
			ValueF = 12.34f;
			ValueS = "hello";
			ValueB = true;
		}

	}

}

下記の名前空間の追加をお忘れなく.
using System.Reflection;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

// これの追加を忘れないように. Don't forget to add this sentence.
using System.Reflection;

namespace aaa
{

	public partial class Form1 : Form
	{
		public Form1()
		{
			InitializeComponent();
		}

		private void menuDebugExec000_Click( object sender, EventArgs e )
		{

			// 結果表示用ストリングビルダ.
			StringBuilder sb = new StringBuilder();

			Type typ = typeof( MyObject );

			BindingFlags bf = BindingFlags.Public |
								BindingFlags.NonPublic |
								BindingFlags.Instance |
								BindingFlags.Static |
								BindingFlags.DeclaredOnly;

			FieldInfo [] fi_arr = typ.GetFields( bf );

			foreach ( var fi in fi_arr )
			{

				// フィールドメンバの「型」の名前を取得する.
				String s0 = fi.FieldType.FullName;

				// フィールドメンバの名前を取得する.
				String s1 = fi.Name;

				// ストリングビルダに追加する.
				String s0_s1 = String.Format( "{0}\t{1}", s0, s1 );
				sb.AppendLine( s0_s1 );

			}

			// 型名とメンバ名をメッセージボックス表示する.
			String strmsg = sb.ToString().Trim();
			String cap = "実行結果";
			MessageBox.Show( strmsg, cap );

		}
	}

}

上記のコードの実行結果です。