SO上

2011-10-26 8 views
4

あり、いくつかの同様の質問ここでの方法に制約された型を渡すが、どれも非常に私の質問に答えるように見えるん..SO上

を私は列挙型を取るメソッドを作成したい、とのリストを生成し、 UIのListItems。このような署名は仕事ができると何か:

public static List<ListItem> ListItemListFromEnum(Type t) 
{ 
    ...   
} 

しかし、私は任意の型を受け入れることを好まないだろう(tは列挙型でなければなりません) だから私はこのような何か行うことができます:

public static List<ListItem> ListItemListFromEnum(Enum e) 
{ 
    Type t = e.GetType(); 
} 

をし、メソッドに正しい型の列挙型を渡すだけです。それは正常に動作しますが、私は実際には(最初の例のように)Typeパラメータを取るが、強制的にEnum型にしたいと思う。

これは可能ですか?ジェネリック医薬品でそれを行う方法はありますか? ありがとう

+4

http://code.google.com/p/unconstrained-melody/をご覧ください。 Jon Skeetが答えなかったとしても、Jon Skeetは答えます。どのように彼の禅。 – dlev

+0

@dlev、あなたは彼が今すぐ答えていないと仮定しています* –

答えて

6

あなたは、このようなメソッドを作りたいわけ場合:

public static List<ListItem> ListItemsListFromEnum<T>() where T:Enum 

その後、それはC#でことはできません。しかし、Jon SkeetをまとめてUnconstrained Melodyとすると、IL後処理で機能が追加されます。 C#コンパイラはこれらの制約に従っているようですが、それを宣言することはできません。

あなたが望むものでない場合は、Typeをそのまま受け入れ、IsEnumのプロパティを確認してください。そうであれば、例外を投げる。

public static List<ListItem> ListItemListFromEnum(Type t) 
{ 
    if (!t.IsEnum) 
    { 
     throw new ArgumentException("Type must be an enumeration", "t"); 
    }  
} 

同様にあなたはジェネリックと同じことを行うことができます:

public static List<ListItem> ListItemListFromEnum<T>() 
{ 
    if (!typeof(T).IsEnum) 
    { 
     throw new ArgumentException("Type must be an enumeration", "t"); 
    }  
} 

唯一のマイナスは、あなたが実行時例外ではなく、コンパイル時1を取得しますがあります。

+0

これは私が欲しかったものです。実行時に確認する必要があると思います – Erix

1

Typeを受け入れ、そのタイプがenumタイプでない場合はスローします。これはおそらく最良の方法です(C#で汎用タイプのプレースホルダがEnumで制約されるまで)。

public static List<ListItem> ListItemListFromEnum(Type t) 
{ 
     if (!t.IsEnum) 
     { 
      throw new ArgumentException("The type passed in must be an enum type.");     
     } 

     // ... 
} 

これは、C#自体が(例えばEnum.GetEnumNames()など)Enumクラスの静的メソッドの多くで何をするかです。

+0

私はそれを考えましたが、コンパイル時のチェックが必要でした – Erix

+1

@Erix:そうです、私はそれにも走りました。 :Enum'でもC#では(現在)できません。 –

関連する問題