2015-05-26 2 views
0

Есть ли способ, чтобы сделать следующий, смотрите пример:Как использовать перечисление как значение словаря?

У меня есть перечисление с фильтрами:

enum SearchFilters 
{ 
     Id, 
     ItemsPerPage 
}; 

enum ReportFilters 
{ 
    Name, 
    Age 
}; 

И перечисление со страницами:

enum Pages 
{ 
    Search, 
    Report 
}; 

Есть ли способ сделать что-то вроде это:

Dictionary<string, enum> filters = new Dicionary<string, enum>() 
{ 
    {Pages.Search.ToString(), SearchFilters}, 
    {Pages.Report.ToString(), ReportFilters} 
}; 

И использовать его как:

filters[Pages.Search.ToString()]. <--- and here will appear the list of enum values. 

Например, вы можете использовать значение SearchFilters перечисления:

filters[Pages.Search.ToString()].ItemPerPage 

Любые идеи?

Спасибо.

+0

Лучше использовать контекст linq для такого. –

+0

Ваш вопрос по-прежнему не однозначен для меня. –

ответ

0

Вы можете сделать что-то подобное. Но я не думаю, что идея иметь разные перечисления в одном словаре хороша.

Dictionary<Pages, Type> filters = new Dictionary<Pages, Type>() 
{ 
    {Pages.Search, typeof(SearchFilters)}, 
    {Pages.Report, typeof(ReportFilters)} 
}; 

var arr = Enum.GetValues (filters [Pages.Report]); 
0

Вы должны либо использовать Dictionary<string, Array>:

var filters = new Dictionary<string, Array>() 
    { 
     { "Search", Enum.GetValues(typeof(SearchFilters)) } 
    }; 

filters["Search"].Length; // 2. 
filters["Search"].Cast<SearchFilters>().Count(); // 2 

или просто хранить Type в Dictionary<string, Type>:

var filters = new Dictionary<string, Type>() 
    { 
     { "Search", typeof(SearchFilters) } 
    }; 

Enum.GetValues(filters["Search"]).Length; // 2 
+0

, но лучший способ - создать свой собственный класс для этого –

0

Вы не можете иметь два различных типа в одном словаре (кроме вас box- распаковать тип). Я предлагаю сохранить Key как enum Page и значение List<string>.

Затем вы можете создать следующее расширение для перечисления:

public static List<string> ToMemberList(this Enum enumerationValue) 
     { 
      var type = enumerationValue.GetType(); 
      return Enum.GetValues(type).Cast<object>().Select(x => x.ToString()).ToList(); 
     } 

и использовать его таким образом, чтобы создать свой словарь:

var dit = new Dictionary<Pages, List<string>>() 
           { 
            { Pages.Search, SearchFilters.Id.ToMemberList() }, 
            { Pages.Report, ReportFilters.Age.ToMemberList() } 
           }; 

var x1 = dit[Pages.Search]; 

Здесь x1 содержит список значений в SearchFilters как строки.

Примечание. Не забудьте сохранить метод расширения внутри статического класса.

Смежные вопросы