2007年08月31日

EnumDisplayName

お久しぶりです。自分のとこですが。

ちょうど書くネタが現れたので、久々に記事を書いてみました。ネタ元は propertyGridで、プロパティ値を日本語表示したい というスレッド。

列挙型をプロパティグリッドに表示する際に、別名で表示したい。それには TypeConverter 属性を指定すればいいんですが、それを一々列挙型ごとに EnumConverter 派生クラスを作るのは面倒だと。

で、まあ上記のスレッドに私が書いたようなのが基本だと思うので、それをそのままコードに起こしてみました。というか試して動作を確認してから書いてるんで順序が逆なんですが。でも面倒なんで C# だけ。


[AttributeUsage(AttributeTargets.All)]
public class EnumDisplayNameAttribute : Attribute {
    public EnumDisplayNameAttribute(string name) {
        this.name = name;
    }
    public string Name {
        get { return GetName(CultureInfo.CurrentCulture); }
    }
    public virtual string GetName(CultureInfo culture) {
        return this.name;
    }
    private string name;
}
public class EnumDisplayNameConverter : EnumConverter {
    public EnumDisplayNameConverter(Type type) : base(type) {
    }
    public override object ConvertFrom(ITypeDescriptorContext context,
                                       CultureInfo culture,
                                       object valueToConvert) {
        string value = valueToConvert as string;
        if (value != null) {
            foreach (FieldInfo field in base.EnumType.GetFields()) {
                string name = this.GetDisplayName(field, culture);
                if (name == value)
                    return field.GetValue(null);
            }
        }
        return base.ConvertFrom(context, culture, valueToConvert);
    }
    public override object ConvertTo(ITypeDescriptorContext context,
                                     CultureInfo culture,
                                     object value,
                                     Type destinationType) {
        if (destinationType == typeof(string)) {
            string valueName = Enum.GetName(base.EnumType, value);
            if (valueName != null) {
                FieldInfo field = base.EnumType.GetField(valueName);
                string name = this.GetDisplayName(field, culture);
                if (name != null)
                    return name;
            }
        }
        return base.ConvertTo(context, culture, value, destinationType);
    }
    private string GetDisplayName(FieldInfo field, CultureInfo culture) {
        if (field == null)
            return null;
        Type type = typeof(EnumDisplayNameAttribute);
        Attribute attr = Attribute.GetCustomAttribute(field, type);
        EnumDisplayNameAttribute disp = attr as EnumDisplayNameAttribute;
        return (disp == null) ? null : disp.GetName(culture);
    }
}

[TypeConverter(typeof(EnumDisplayNameConverter)]
public enum Animal {
    [EnumDisplayName("猫")] Cat,
    [EnumDisplayName("犬")] Dog,
    [EnumDisplayName("牛")] Cow,
    [EnumDisplayName("馬")] Hourse,
}
[TypeConverter(typeof(EnumDisplayNameConverter)]
public enum Insect {
    [EnumDisplayName("甲虫")]   Beetle,
    [EnumDisplayName("鍬形虫")] StagBeetle,
    [EnumDisplayName("天道虫")] Ladybug,
    [EnumDisplayName("蟻")]     Ant,
}

public class Sample {
    public Animal Pet1 {
        get { return this.pet1; }
        set { this.pet1 = value; }
    }
    public Insect Pet2 {
        get { return this.pet2; }
        set { this.pet2 = value; }
    }
    private Animal pet1;
    private Insect pet2;
}

public class Test {
    [STAThread] public static void Main() {
        Form f = new Form();
        PropertyGrid grid = new PropertyGrid();
        grid.SelectedObject = new Sample();
        grid.Dock = DockStyle.Fill;
        f.Controls.Add(grid);
        Application.Run(f);
    }
}
 

posted by Hongliang at 23:42| Comment(0) | TrackBack(1) | C# | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

[.NET][C#]PropertyGridでEnum型の値を任意の文字列で表示する
Excerpt: 元ネタはこちら 新しく自分で宣言する型の場合はこれでかなり楽になります。 ですが、既存の型については各値に属性を付けることができない(できるのかもしれませんがわからなかった)ので、これは自前でTyp..
Weblog: ごった日記
Tracked: 2007-11-16 14:43

ここ(hongliang.seesaa.net)で公開しているものについて、利用は自由に行って頂いて構いません。改変、再頒布もお好きになさって下さい。利用に対しこちらが何かを要求することはありません。

ただし、公開するものを使用、または参考したことによって何らかの損害等が生じた場合でも、私はいかなる責任も負いません。

あ、こんなのに使ったってコメントを頂ければ嬉しいです。

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。