Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@marksard

Type.GetFiled()やType.GetProperty()で取得したFildTypeやPropertyTypeからEnumの名前と値をちょっとだけスマートに列挙する方法

 昨日アップした「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で回して最後に入れる、みたいなちょっと回りくどい方法をしなくてよくなってなんとなくすっきり。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?