2015-04-17 3 views
0

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

Предположит, у меня есть два перечислений:

public enum Dogs 
{ 
    Mastiff, 
    Bulldog 
} 

public enum Cats 
{ 
    Manx, 
    Tiger 
} 

На основании выбора пользователя «Кошки» или «Собак» от выпадающего, я хочу, чтобы заполнить еще один ComboBox с соответствующими значениями Enum. Это может быть сделано с помощью метода так:

void PopulateComboBox<EnumType>(RadComboBox box, Enum displayUnits) 
{ 
    // values and text derived from enumExtension methods 
    foreach (Enum unit in Enum.GetValues(typeof(EnumType))) 
    { 
     var item = new RadComboBoxItem(unit.GetName(), unit.ToString()); 
     item.ToolTip = unit.GetDescription(); 
     if (displayUnits != null && unit.ToString() == displayUnits.ToString()) 
      item.Selected = true; 
     box.Items.Add(item); 
    } 
} 

Как получить правильный EnumType из указанного пользователя строки, так что я мог бы назвать это вроде как такие (бонусные очки, если я могу указать параметр «displayUnits» для принудительного выбора):

string choice = myComboBox.SelectedValue; 
?? choiceAsAnEnumType = choice variable converted in some way ?? 
PopulateComboBox<choiceAsAnEnumType>(outputComboBox, null); 

Эта реализация будет полезна, поскольку в моем текущем проекте у меня большое количество Enums. В настоящее время мне нужно сделать switch (choice) и передать соответствующий тип Enum в различных случаях.

Любые вариации метода приемлемы, поскольку я никоим образом не заперт в этой стратегии (вне времени, чтобы реализовать любые другие).

Редактировать: Чтобы объяснить предложение TryParse/Parse, мне не интересно получать значение перечисления (мастиф или бульдог) из строки; скорее, я хочу, чтобы определенный оттенок Enum (Собаки или Кошки) из строки. TryParse требует поставляемый T, где я не знаю T в моем случае. Извиняюсь, если я неправильно понял методы, представленные в качестве примеров для TryParse, я относительно новичок в C# и ASP в целом.

+3

использования 'Enum.TryParse' https://msdn.microsoft.com/en-us/library/dd783499%28v=vs.110%29.aspx – chomba

+0

Возможный дубликат строки [parse string to enum type] (http: // stackoverflow. com/questions/1424971/parse-string-to-enum-type) – paqogomez

+0

Почему бы не добавить перечисление непосредственно в поле со списком (вместо вызова 'unit.GetName'), то вы можете получить к нему доступ через свойство' SelectedItem', а не свойство 'SelectedValue'? – christophano

ответ

0

Вы можете загрузить тип из строки, чтобы перейти к вашему методу, подобному этому. Вы не использовали бы общий метод populate.

class AnimalOptions 
{ 
    public enum Dogs 
    { 
     Mastiff, 
     Bulldog 
    } 

    public enum Cats 
    { 
     Manx, 
     Tiger 
    } 
} 


Type t = typeof(AnimalOptions); 
Type enumType = t.GetNestedType("Dogs"); 
Populate(enumType); 
+0

Есть ли способ сделать это, не упаковывая их все в класс? В настоящее время они - всего лишь отдельные файлы (Dogs.cs, Cats.cs и т. Д.). Хотя я дам это выстрел, если нет. Не требуется много усилий для копирования/вставки перечислений. – rosst

+0

Вы можете использовать отражение, если хотите загрузить его из текущей сборки. 'Assembly.GetExecutingAssembly(). GetTypes(). Сначала (x => x.Name ==" Dogs ");' – jones6

+0

Oo, nice. Является ли метод рефлексии более интенсивным налогом на время загрузки? – rosst

0

Я бы загрузить свой первый выпадающий с типами перечислений, как это:

firstComboBox.Items.Add(new RadComboBoxItem(typeof(Dogs), typeof(Dogs).Name)); 
firstComboBox.Items.Add(new RadComboBoxItem(typeof(Cats), typeof(Cats).Name)); 

Затем вызывается из выбранного элемента событие изменения на первом поле:

secondComboBox.Items.Clear(); 
foreach (var value in Enum.GetValues(firstComboBox.SelectedValue)) 
{ 
    secondComboBox.Items.Add(new RadComboBoxItem(value, value.ToString())); 
} 
Смежные вопросы