|
■No90596 (Hongliang さん) に返信 > 拡張メソッドにする意義が分かりません。 > Public Function EnumToDictionary(Of T)() As Dictionary(Of String, T) > と言う関数をモジュールに定義すれば十分ではないでしょうか。
自分も同意見です。
もしも Module にしたくないのであれば、 Dim dic = EnumUtil(Of DayOfWeek).ToDictionary() というような実装にするという手もあります。
' Partial Public NotInheritable Class EnumUtil(Of TEnum As Enum) 'VB 15.8 時点ではまだサポートされていないので Partial Public NotInheritable Class EnumUtil(Of TEnum As Structure) '値型制約で代用 Shared Sub New() Debug.Assert(GetType(TEnum).IsEnum, "列挙型ではありません。") '制約不足をアサーションで補う End Sub Public Shared Function ToDictionary() As Dictionary(Of String, TEnum) Return [Enum].GetNames(GetType(TEnum)).ToDictionary( Function(x) x, Function(x) DirectCast([Enum].Parse(GetType(TEnum), x), TEnum)) End Function End Class
■No90595 (yoshi さん) に返信 > 環境:VB2017、.Net4.72 4.72 ではなく 4.7.2 ですよね。
> Dim dic =[Enum].ToDictionary(GetType(DayOfWeek))
なんだか前提条件がいろいろとおかしいです…。 Shared なメソッドのように振る舞う拡張メソッドは作れませんよ。
上記の ToDictionary は、Enum クラスに対する Shared なメソッドであるかのように書かれていますが、 拡張メソッドは、「インスタンスメソッドのように振る舞う」ためのシンタックスシュガーです。
仮に Shared な拡張メソッド構文が存在していたとしても、 その呼び出しでは型パラメーターが無いので、戻り値の型をコンパイル時に決定できませんよね。 [Enum].ToDictionary(Of DayOfWeek)( ) あるいは、 DayOfWeek.ToDictionary( ) あたりであれば決定できますが、いずれにせよ現時点ではありえない構文ですし、 拡張メソッドの出番は無さそうです。
> Enumの名前をキーとするDictionaryを作る拡張メソッドを以下のように作りました。
VB 15.8 時点では (Of TEnum As Enum) はサポートされていませんが、 C# 7.3 であれば、where TEnum : Enum がサポートされていますので、
// Dictionary<string, DayOfWeek> が返却される var result = default(DayOfWeek).ToDictionry();
のように使える拡張メソッドを書くこともできます。
public static Dictionary<string, TEnum> ToDictionry<TEnum>(this TEnum _) where TEnum : Enum => Enum.GetNames(typeof(TEnum)).ToDictionary(x => x, x => (TEnum)Enum.Parse(typeof(TEnum), x));
|