2017-01-27 13 views
0

私はこれについていくつかの助けを得ることを望んでいました。辞書のキーである文字列と、キャストする必要がある列挙型を取ることができる関数が必要です。変数を使った列挙型の列挙

辞書キーは、列挙型に対応する数字になります。私は列挙型に変数をキャストする方法を知る必要があります。

ここに私が書いた機能があります。これは私の説明よりもはっきりしているかもしれません。

string GetEnum(string keyName, Enum enumType) 
{ 
    var defaultOut = ""; 
    Model.Form.TryGetValue(keyName, out defaultOut); 
    if(defaultOut != ""){ 
     return EnumDescriptionUtility.GetDescription((enumType)Convert.ToInt32(defaultOut));    
    } 
    else{ 
     return defaultOut;  
    } 
} 

私は以前このコードのほとんどを使っていました。以前の違いは、enumTypeが実際の列挙型にハードコードされていたことです。私はすべての繰り返しを関数に負担したい。

何か助けていただければ幸いです。

+0

ここには多くの潜在的な問題があります。コンバージョンを確認していますか?また、なぜ文字列をint型に変換し、次にenum型に変換するのですか...なぜ単に文字列を列挙型に変換しないのですか?それとも、文字列全体を切り詰めて列挙型(つまり、 'TryGetValue'への出力)として扱うのはなぜですか? –

+0

悪い変換のチェックを追加することができます。文字列はデータベースから出てきます。だから私はそれを列挙型に変換する必要がありますユーザーは素晴らしいバージョンに直面している列挙型の説明を取得します。 – HarvP

+0

私はあなたの 'defaultOut'が' Convert.ToInt32'に常に渡されるのなら、どうしてそれが文字列なのですか?なぜintではないのですか?または、私が言ったように、それをenumにしてみませんか? –

答えて

1

私はあなたのQを理解しているわけではありませんが、もしそうであれば、特定の列挙型に値をキャストしたいですか?

これは最近、指定した列挙型の値を解析するために作成した拡張メソッドです。この場合の値は、列挙型の文字列名です。

public static T ToEnum<T>(this string val) where T : struct 
{ 
    T t; 
    if (Enum.TryParse(val, out t)) 
      return t; 
    return default(T); 
} 

そして、あなたは次のようにそれを使用します。私が正しくあなたを理解していればそれで、あなたは彼らが列挙型と整数値の型を知っている

public enum MyEnum{ 
    A = 1, 
    B = 2, 
    C = 3 
} 

public enum MyOtherEnum{ 
    D = 1, 
    E = 2, 
    F = 3 
} 


string str = "A"; 
MyEnum yourEnum = str.ToEnum<MyEnum>(); 

string str2 = "A"; 
MyOtherEnum yourOtherEnum = str.ToEnum<MyOtherEnum>(); 
+0

これは近いですが、すべての列挙型は整数を使い果たします。 – HarvP

+0

をint型で使用すると、単純に 'MyEnum myEnum =(MyEnum)YourInt'または' MyEnum myEnum =(MyEnum)Convert.ToInt32(YourIntAsAString) 'を実行できます - 実際の列挙型の例がありますか? – Darren

0

。私は簡単な例を設定したので、あなたのenumに関する情報は一切含んでいませんでした。

public enum Letter 
    { 
     A, 
     B, 
     C 
    } 

    public enum Number 
    { 
     One, 
     Two, 
     Three 
    } 

あなたがタイプと整数値を知っているのであれば、あなたはこのような列挙型を取得することができます:

public static Enum GetEnum(Type type, int val) 
    { 
     Enum e = null; 

     if (type == typeof(Letter)) 
     { 
      e = (Letter)val; 
     } 
     else if (type == typeof(Number)) 
     { 
      e = (Number)val; 
     } 

     return e; 
    } 

あなたはそれを使用してその型を検査する必要があります。多分このように:あなただけの指定された型とint型のための列挙型の名前を表す文字列を取得したい場合は、あなたがしたい場合は

public static string StringFromEnum(Enum e) 
    { 
     string result = null; 

     if (e.GetType() == typeof(Letter)) 
     { 
      result = ((Letter)e).ToString(); 
     } 
     else if (e.GetType() == typeof(Number)) 
     { 
      result = ((Number)e).ToString(); 
     } 

     return result; 
    } 

    public static void Main(string[] args) 
    { 
     int val1 = 2; 
     Type type1 = typeof(Letter); 
     int val2 = 0; 
     Type type2 = typeof(Number); 

     var result1 = GetEnum(type1, val1); 
     var result2 = GetEnum(type2, val2); 

     Console.WriteLine("result1 {0}", StringFromEnum(result1)); 
     Console.WriteLine("result2 {0}", StringFromEnum(result2)); 

     Console.ReadKey(); 
    } 
+0

キャストするエニュメントが多すぎるという問題があります。私はその列挙型の変数を渡すことができ、それを使ってint型をキャストするか、少なくともそれから型を取得できることを期待していました。この関数は、それが何を取得するか気にしてはいけません。 – HarvP

0

、次のEnum.GetName()

public enum Letter 
    { 
     A, 
     B, 
     C 
    } 

    public enum Number 
    { 
     One, 
     Two, 
     Three 
    } 

    public static void Main(string[] args) 
    { 
     int val1 = 2; 
     Type type1 = typeof(Letter); 
     int val2 = 0; 
     Type type2 = typeof(Number); 

     var result1 = Enum.GetName(type1, val1); 
     var result2 = Enum.GetName(type2, val2); 

     Console.WriteLine("result1 {0}", result1); 
     Console.WriteLine("result2 {0}", result2); 

     Console.ReadKey(); 
    } 

を使用して行うことができます実際の列挙型、私はあなたが他の答えに似た何かをしなければならないと思います。 Type変数を使用してキャストしたいと思うようです:

Type type1 = typeof(Letter); 
var result = (type1) val1; // wrong 

私はそうすることはできないと思います。ジェネリックでも、ある時点で型を指定する必要があります。