昨日アップした「C#のリフレクションを使ってC#クラスからC構造体を生成する」でEnumの値も取り出すようにしたいねとちょっと書きました。
Type.GetFiled()やType.GetProperty()の戻り値の(他は調べてないので知りませんが)FildTypeやPropertyTypeにはGetEnumValues()てのがあって値も簡単に取り出せます。
var enumNames = new Dictionary<string, string[]>(); // enumの中身を入れとく
var prop = type.GetField(memberInfo.Name);
var names = new List<string>();
foreach (var value in prop.FieldType.GetEnumValues())
{
names.Add(string.Format("{0} = {1}", value.ToString(), (int)value));
}
enumNames[prop.FieldType.Name] = names.ToArray();
valueがEnumなのでToString()すれば名前も取り出せて一石二鳥。
ただなんとなくforeachに一行がアレ。LINQ出来たよね?と調べたら、ArrayはLINQ出来ないっぽい。
なのでこうしてみました。
var enumNames = new Dictionary<string, string[]>(); // enumの中身を入れとく
var prop = type.GetField(memberInfo.Name);
enumNames[prop.FieldType.Name] = prop.FieldType.GetEnumNames().Select(name =>
string.Format("{0} = {1}", name, (int)Enum.Parse(prop.FieldType, name))
).ToArray();
GetEnumNames()で取得したEnumの列挙名と、Enumのタイプ(prop.FieldType)から値を取り出してます。
最初のやつのvar namesを空で作ってforeachで回して最後に入れる、みたいなちょっと回りくどい方法をしなくてよくなってなんとなくすっきり。