0

この列挙型を作成しました

 public enum Days
    {
        [Display("Monday")]
        Mon,
        [Display("Tuesday")]
        Tue,
        [Display("Wednesday")]
        Wed,
        [Display("Thursday")]
        Thu,
        [Display("Friday")]
        Fri,
        [Display("Satrday")]
        Sat,
    }

文字列「月曜日」を取得したい。私はこれをやってみました

Console.WriteLine(Days.mon);

しかし、「月曜日」ではなく「月」が表示されます。文字列月曜日を取得する方法はありますか?

4

2 に答える 2

10

この回答を拡張して、より完全なソリューションを提供し、セマンティック構文を改善しました。

using System;
using System.ComponentModel;

public static class EnumExtensions {

    // This extension method is broken out so you can use a similar pattern with 
    // other MetaData elements in the future. This is your base method for each.
    public static T GetAttribute<T>(this Enum value) where T : Attribute {
        var type = value.GetType();
        var memberInfo = type.GetMember(value.ToString());
        var attributes = memberInfo[0].GetCustomAttributes(typeof(T), false);
        return (T)attributes[0];
    }

    // This method creates a specific call to the above method, requesting the
    // Description MetaData attribute.
    public static string ToName(this Enum value) {
        var attribute = value.GetAttribute<DescriptionAttribute>();
        return attribute == null ? value.ToString() : attribute.Description;
    }

}

このソリューションは、Enum で拡張メソッドのペアを作成し、探していることを実行できるようにします。のクラスのEnum構文を使用するために、コードを少し拡張しました。DisplayAttributeSystem.ComponentModel.DataAnnotations

using System.ComponentModel.DataAnnotations;

    public enum Days {
        [Display(Name = "Sunday")]
        Sun,
        [Display(Name = "Monday")]
        Mon,
        [Display(Name = "Tuesday")]
        Tue,
        [Display(Name = "Wednesday")]
        Wed,
        [Display(Name = "Thursday")]
        Thu,
        [Display(Name = "Friday")]
        Fri,
        [Display(Name = "Saturday")]
        Sat
    }

上記の拡張メソッドを使用するには、次のように呼び出すだけです。

Console.WriteLine(Days.Mon.ToName());

また

var day = Days.Mon;
Console.WriteLine(day.ToName());
于 2013-10-27T18:02:11.110 に答える
2
var type = typeof(Days);
var memInfo = type.GetMember(Days.Mon.ToString());
var attributes = memInfo[0].GetCustomAttributes(typeof(DisplayAttribute),
    false);
var description = ((DisplayAttribute)attributes[0]).Description;

このソリューションに似ています。

于 2013-10-27T12:01:53.510 に答える