クラスのフィールドの型の名前とフィールド名を取得する
実行時にクラスのフィールドの型を知りたい場合があります。たとえば、ある数値を示す文字列があって、その文字列を 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 );
}
}
}
上記のコードの実行結果です。