2017-01-27 4 views
0

Я надеялся получить некоторую помощь в этом. Мне нужна функция, которая может принимать строку, которая является ключом для словаря, и тип перечисления, который должен быть отброшен.Enum Casting With a Variable

Клавиша словаря будет числом, которое соответствует перечислению. Мне нужно знать, как передать int в перечисление, где перечисление переменной.

Это функция, поскольку у меня она написана. Это может быть более ясно, чем мое объяснение.

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 ... почему бы просто не преобразовать из строки в enum? Или еще лучше, почему бы просто не полностью опустить строку и работать с перечислениями (т. Е. Как выход в «TryGetValue»)? –

+0

Я могу добавить чек для плохого преобразования. Строка выводится из базы данных. Поэтому мне нужно преобразовать его в перечисление, чтобы получить описание перечисления, которое представляет собой пользователь, стоящий перед хорошей версией. – HarvP

+0

Мне просто интересно, почему, если ваш 'defaultOut' всегда будет передан' Convert.ToInt32', почему это строка? Почему не просто int? Или, как я уже сказал, почему бы не сделать переписью? –

ответ

1

Я не уверен на 100%, я понимаю ваш 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

Так что, если я вас правильно понимаю, вы знаете, они типа перечислимого и целое значение. Вы не указали какую-либо информацию о своих перечислениях, поэтому я создал простой пример.

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; 
    } 

Вам нужно будет проверять его тип, чтобы использовать его. Может быть, как это:

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 type1 = typeof(Letter); 
var result = (type1) val1; // wrong 

И я не думаю, что вы можете это сделать. Даже с дженериками вам нужно будет указать тип в какой-то момент.