2013-04-06 7 views
7

にリフレクションを使用して文字列値で、未知の列挙型のインスタンスを作成します。 .Enum、私の値はミステリー列挙型の項目に一致するint値です。実行時に、私は列挙型のSystem.Typeをを持っており、BaseTypeはシステムであることを確認しているとき、私は列挙型のインスタンスを作成する方法を正確にワークアウト問題を抱えているのC#

私はこれまで持っているコードは、以下に示すように、上述しただけの論理です。

 if (Type.GetType(type) != null) 
     { 
      if (Type.GetType(type).BaseType.ToString() == "System.Enum") 
      { 
       return ???; 
      } 
     } 

私は過去に列挙型を扱う常にイム混乱し、私が解析しようとしています列挙コードの時点ではなく、このシナリオでは知っているとGoogleに優しい方法で、私の質問を明確少し運を持っていました...私は通常のような何かをするだろう

(SomeEnumType)int 

しかし、私は、コードタイムでEnumTypeを知っていないので、私は同じことを達成することができますか?

+0

少しあなたが後に何をしたいか何を混乱さ「を返すに???」と、なぜあなたは、この場合には反射が必要なのです。同じ(SomeEnumType)型を使用して型をSomeEnumTypeにキャストできます。 – outcoldman

+0

問題は、私は実行時に任意の列挙型である可能性がありますかわからないです..リターン??? [/コード] –

+0

この行 'Type.GetType(タイプ).BaseType.ToString()== "System.Enum"; [コード] Enum.Parse(Type.GetType(タイプ)、OB)のようなものであろう'オブジェクトは' SomeEnumType'から 'SomeEnumType'に変換する必要があるのですか?あなたはこれで何を達成したいと考えているのですか? – outcoldman

答えて

10

EnumクラスにToObjectメソッドを使用します。一般的な機能として

if (Type.GetType(type) != null) 
{ 
    var enumType = Type.GetType(type); 
    if (enumType.IsEnum) 
    { 
     return Enum.ToObject(enumType, value); 
    } 
} 
+1

は' 'それはenumType.IsEnum'を書くことが容易に(そしておそらく相当)です。 –

+0

なぜEnum.ToObjectメソッドを終了しましたか?私はあなたのように 'string'インスタンスを通過するよりもはるかに気に入っていました。 –

0

使用(ENUMName)Enum.Parse(typeof(ENUMName), integerValue.ToString())

(構文エラーを修正するために編集:

var enumValue = Enum.ToObject(type, value); 

それとも、提供されたコードのように

)...

public static E GetEnumValue<E>(Type enumType, int value) 
         where E : struct 
    { 
     if (!(enumType.IsEnum)) throw new ArgumentException("Not an Enum"); 
     if (typeof(E) != enumType) 
      throw new ArgumentException(
       $"Type {enumType} is not an {typeof(E)}"); 
     return (E)Enum.Parse(enumType, value.ToString()); 
    } 

古い間違ったバージョン:

public E GetEnumValue(Type enumType, int value) where E: struct 
{ 
    if(!(enumType.IsEnum)) throw ArgumentException("Not an Enum"); 
    if (!(typeof(E) is enumType)) 
     throw ArgumentException(string.format(
      "Type {0} is not an {1}", enumType, typeof(E)); 
    return Enum.Parse(enumType, value.ToString()); 
} 
+1

これはいくつかの点で間違っているようです。 (1)メソッドに 'where'制約がありますが、' E'型を「定義」してメソッドを汎用化することは忘れてしまいます。 (2)メソッド呼び出し時に 'E'をどのように供給するのですか?コンパイラによって推論されることはありません。 (3) 'is'式が構文的に間違っています。 'is'の右側はオブジェクトであり、型ではありません。あなたは 'is'の代わりに'!= 'を使うつもりでしょうか?目的は何ですか? (4)戻り値の型は、非一般的な 'Enum.Parse'メソッドからの出力をキャストする必要があります。 –

+0

申し訳ありませんが、コンパイルチェックなしで入力してください。構文エラーを修正するために編集されました。 –

関連する問題