FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » C# »【C#】クラスのフィールド名を文字列の配列で取得する

【C#】クラスのフィールド名を文字列の配列で取得する  


 ただのメモ。クラスや構造体をデータのやり取りに使う際、フィールド名を一覧で取得したいときがある。JSONスキーマ的なものとかね。そんな時に役立つ簡単なサンプルコード。

●フィールド名を取得するクラス例
using System.Linq;
using System.Reflection;

public class Sample //※名前は任意(typeof で指定する)
{
//取得するフィールド
public const string c_value = "const value";
public static readonly string s_value = "static value";
public string pub_value = "public value";
private string pri_value = "private value";

//フィールド名を string[] で返す
public string[] GetFieldNames()
{
var bindingFlags = BindingFlags.Public //┐どちらか一方は指定する
| BindingFlags.NonPublic //┘
| BindingFlags.Instance //┐どちらか一方は指定する
| BindingFlags.Static //┘
| BindingFlags.DeclaredOnly; //このクラスのみ(継承などは含めない)

var t = typeof(Sample); //取得するクラス名
var fields = t.GetFields(bindingFlags);
return fields.Select(e => e.Name).ToArray();
}
}

●メインコード例
using System;

var sample = new Sample();
var names = sample.GetFieldNames();
Console.WriteLine($"Length = {names.Length}");
foreach (var item in names)
{
Console.WriteLine(item);
}

Length = 4
c_value
s_value
pub_value
pri_value

 BindingFlags の指定で、public や private, インスタンスや static などを選択することができる(少なくともこれらの属性は指定した方が良い)。また継承してるクラスがある場合、BindingFlags.DeclaredOnly でスーパークラスのフィールドを除外することもできる。

 ここではフィールド名が欲しかったので Type.GetFields() を使っているが、メソッドやプロパティ名を取得したいなら、Type.GetMembers() を同様に使えば良い。

 リフレクション(Reflection)関連は使いこなせれば色々と便利だが、ランタイム時の負荷はそれなりにかかるそうで、実行速度を優先するなら、先に文字列化したものをデータ化しておくなど、工夫した方が良いだろう。使い所は適切に(笑)。

BindingFlags 列挙型
Type.GetFields()
Type.GetMembers()
リフレクション





(関連記事)
【C#】【Unity】enum 型と string, int 型の相互変換など


関連記事
スポンサーサイト



category: C#

thread: プログラミング

janre: コンピュータ

tag: C#リファレンス 
tb: 0   cm: --


トラックバック

トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/352-567acad5
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR