私はいくつかの ASP.NET MVC 3 を実行しており、列挙型を操作するためのいくつかの拡張メソッドをセットアップしています。1 つは [Description] 属性を探す凝った ToString() で、もう 1 つは Html.DropDownList() で使用する列挙型から SelectList を作成します。これらのメソッドは両方とも同じ静的クラスにあります。
public static SelectList ToSelectList<TEnum>(this TEnum? enumval) where TEnum : struct {
var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = e, Name = e.GetDescription() };
SelectList list = new SelectList(values, "ID", "Name", enumval);
return list;
}
public static string GetDescription<TEnum>(this TEnum? enumval) where TEnum : struct {
//Some reflection that fetches the [Description] attribute, or returns enumval.ToString() if it isn't defined.
}
しかし、コンパイラは、それを述べて、不平Name = e.GetDescription()
を言います...
'TEnum' には 'GetDescription' の定義が含まれておらず、タイプ 'TEnum' の最初の引数を受け入れる拡張メソッド 'GetDescription' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)
これは大きな驚きではありませんが、コンパイラに GetDescription() を ToSelectList() の enumval パラメーターの有効な拡張メソッドとして認識させる方法がわかりません。GetDescription() の根幹をプライベートな静的メソッドに移動し、拡張メソッドをその単なるラッパーにすることで、おそらくこれを機能させることができると思いますが、ジェネリック拡張メソッドをチェーンすることは、適切に行う方法を知っておく必要があるようです。