1. ホーム
  2. c#

[解決済み] 列挙型のコンボボックスで、列挙型の値に独自の文字列フォーマットを適用するにはどうすればよいですか?

2022-06-06 19:31:14

質問

投稿の中で 列挙型 ToString の記事では、カスタム属性の DescriptionAttribute をこのように使用します。

Enum HowNice {
  [Description("Really Nice")]
  ReallyNice,
  [Description("Kinda Nice")]
  SortOfNice,
  [Description("Not Nice At All")]
  NotNice
}

そして、関数を呼び出して GetDescription のような構文を使って

GetDescription<HowNice>(NotNice); // Returns "Not Nice At All"

しかし、それでは本当に を呼び出すように ComboBox を強制できないので、ComboBox に単に列挙型の値を入力したい場合、これは本当に役に立ちません。 GetDescription .

私が欲しいものは、次のような要件があります。

  • 読書 (HowNice)myComboBox.selectedItem を読み込むと、選択された値がenum値として返されます。
  • ユーザは、列挙値の名前だけでなく、ユーザフレンドリーな表示文字列を見る必要があります。そのため、" を見るのではなく NotNice と表示される代わりに、" Not Nice At All "と表示されます。
  • うまくいけば、このソリューションは、既存の列挙に対する最小限のコード変更を必要とします。

明らかに、私は作成する各列挙体のために新しいクラスを実装し、その ToString() をオーバーライドすることもできますが、それは各列挙体のための多くの作業であり、私はむしろそれを避けたいのです。

何かアイデアはありませんか?

ヘック、私はさらに ハグ を懸賞金として差し上げましょう:-)

どのように解決するのですか?

指定された属性を読み込んでリソースを検索するTypeConverterを書くことができる。そうすれば手間をかけずに表示名の多言語対応ができるだろう。

TypeConverterのConvertFrom/ConvertToメソッドを調べて、enumの属性を読み取るためにリフレクションを使う。 フィールド .