6

列挙型を受け取り、各 int が列挙型の名前 (文字列として) に関連付けられている Dictionary に変換するメソッドを作成しました

// Define like this
public static Dictionary<int, string> getDictionaryFromEnum<T>()
{
   List<T> commandList = Enum.GetValues(typeof(T)).Cast<T>().ToList();
   Dictionary<int, string> finalList = new Dictionary<int, string>();
   foreach (T command in commandList)
   {
    finalList.Add((int)(object)command, command.ToString());
   }
 return finalList;
 }

(ps。はい、私はダブルキャストを持っていますが、アプリケーションは非常に安価で汚いC#列挙型からJavascript列挙型へのコンバーターになることを意図しています)。

こんな感じで簡単に使えます

private enum _myEnum1 { one = 1001, two = 1002 };
private enum _myEnum2 { one = 2001, two = 2002 };
// ... 
var a = getDictionaryFromEnum<_myEnum1>();
var b = getDictionaryFromEnum<_myEnum2>();

ここで、呼び出しを繰り返す一連の呼び出しに使用する列挙型のリストを作成できるかどうか疑問に思っていました。

これは元の質問にありました: [Why can't I call this?]

このような通話を作成するにはどうすればよいですか?

List<Type> enumsToConvertList = new List<Type>();
enumsToConvertList.Add(typeof(_myEnum1));
enumsToConvertList.Add(typeof(_myEnum2));
// this'll be a loop
var a = getDictionaryFromEnum<enumsToConvertList.ElementAt(0)>();
4

5 に答える 5

6

実行時にジェネリック引数タイプを指定することはできません(まあ、リフレクションなしで)。Typeしたがって、次のタイプの引数を受け入れる非ジェネリックメソッドを作成するだけです。

public static Dictionary<int, string> getDictionaryFromEnum(Type enumType)
{
    return Enum.GetValues(enumType).Cast<object>()
               .ToDictionary(x => (int)x, x => x.ToString());
}

使用法:

List<Type> enumsToConvertList = new List<Type>();
enumsToConvertList.Add(typeof(_myEnum1));
enumsToConvertList.Add(typeof(_myEnum2));

var a = getDictionaryFromEnum(enumsToConvertList[0]);
于 2013-02-04T16:50:56.440 に答える
2

なぜ私はこれを呼ぶことができないのですか?

その場合、System.Typeコンパイル時の値である汎用指定子とは異なる、を渡します。

于 2013-02-04T16:50:03.887 に答える
0

簡単に言うと、ジェネリックの型パラメーターはコンパイル時に認識されている必要があります。

System.Type ランタイムオブジェクトをジェネリック型指定子として渡そうとしていますが、これは不可能です。


あなたが達成しようとしていることに関しては、あなたは常にを返すので、あなたのメソッドは実際には一般的である必要はありませんDictionary<int, string>Type@lazyberezovskyが示すように、代わりにメソッドにパラメータとしてを渡してみてください。

于 2013-02-04T16:49:43.040 に答える
0

後でタイプに変換します。

List<Type> enumsToConvertList = new List<Type>();
enumsToConvertList.Add(_myEnum1);
var a = getDictionaryFromEnum<typeof(enumsToConvertList.ElementAt(0))>();
于 2013-02-04T16:57:02.000 に答える