あなたが苦労していると思うのは、説明の取得です。一度あなたがあなたの正確な結果を与える最終的な方法を定義できるものを持っていると確信しています。
最初に、拡張メソッドを定義すると、enum型自体ではなく、列挙型の値に対して機能します。そして、私は使い方が簡単なので、(静的メソッドのような)型のメソッドを呼びたいと思います。残念ながら、それらを定義することはできません。
できることは次のとおりです。 、
public static string GetDescription(this Enum value) {
string description = value.ToString();
FieldInfo fieldInfo = value.GetType().GetField(description);
DescriptionAttribute[] attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes != null && attributes.Length > 0) {
description = attributes[0].Description;
}
return description;
}
次の列挙型のすべての値をとる方法を定義し、我々値をルックアップするために、以前のメソッドを使用します。まず、それが1つを持っている場合は、列挙値の説明を取得するメソッドを定義します表示したい、そしてそのリストを返す。ジェネリック引数は推論できます。
public static List<KeyValuePair<TEnum, string>> ToEnumDescriptionsList<TEnum>(this TEnum value) {
return Enum
.GetValues(typeof(TEnum))
.Cast<TEnum>()
.Select(x => new KeyValuePair<TEnum, string>(x, ((Enum)((object)x)).GetDescription()))
.ToList();
}
最後に、使いやすさのために、値なしで直接呼び出す方法です。しかし、汎用の引数はオプションではありません。
public static List<KeyValuePair<TEnum, string>> ToEnumDescriptionsList<TEnum>() {
return ToEnumDescriptionsList<TEnum>(default(TEnum));
}
今、私たちはこのようにそれを使用することができます:
enum TestEnum {
[Description("My first value")]
Value1,
Value2,
[Description("Last one")]
Value99
}
var items = default(TestEnum).ToEnumDescriptionsList();
// or: TestEnum.Value1.ToEnumDescriptionsList();
// Alternative: EnumExtensions.ToEnumDescriptionsList<TestEnum>()
foreach (var item in items) {
Console.WriteLine("{0} - {1}", item.Key, item.Value);
}
Console.ReadLine();
出力する:相手に後期
Value1 - My first value
Value2 - Value2
Value99 - Last one
ありがとう: )正直言って、私はちょうど(もし可能であれば)本当に簡単なものを望んでいるので、 'eChargeType.ToSelectList()'を使うことができます - 私は不要な混乱を追加する可能性がある 'DescriptionAttribute'を除外するために私の例の複雑さを減らしました。ありがとう! – Jimbo
残念ながら、静的メソッドを列挙型に追加したいので、 'eChargeType.ToSelectList()'は不可能です。それは不可能ですが、どこかで静的ヘルパーメソッドを作成することができます。 – Maarten
上記のあなたのコメントを参照して、この投稿の作者が達成したいと思っていたことについて、どんな光を放つことができますか? http://stackoverflow.com/a/276589/175893私は同じ任務にいると思っていました!ありがとう – Jimbo