Если вы хотите размер перечисления, вы можете сделать это:
enum Foo { A , B , C , ... , }
...
int[] someArray = new int[ sizeof(Foo) ] ;
Но это не даст вам того, что вы хотите, так как sizeof
возвращает размеробъекта в октетах (в данном случае 4, так как перечисление по умолчанию переносит Int32).
Чтобы получить число значений в перечислении,сделайте что-то вроде этого:
enum Foo { A , B , C , ... , }
...
int[] someArray = new int[ Enum.GetValues(typeof(Foo)).Length ] ;
Если вы планируете использовать значение перечисления для индексации в массиве, вы должны заметить, что это делает [необоснованным] предположение, что значения перечисления начинаются с 0и увеличение на 1: последующее изменение определения перечисления, которое нарушает предположение, нарушит все.
Кроме того, если к перечислению применен атрибут [Flags]
, то домен перечисления потенциально может быть [намного] больше, чем определенное количество дискретных значений.
Было бы лучше использовать словарь, таким образом:
[Flags]
enum Foo { Unknown = 0 , A = 1 , B = 2 , C = 4 , D = 8 , E = 16 , ... , }
...
Dictionary<Foo,SomeType> myDictionary = new Dictionary<Foo,SomeType>() ;
Теперь ваш код стал гораздо более гибким: вы не делаетезаботиться о том, как устроены внутренние элементы перечисления.
Вы можете даже предварительно заполнить словарь ожидаемым набором ключей (и выдать исключение, если передано значение, отличное от ожидаемого).
Отредактировано в примечание:
Вы также можете сделать что-то подобное:
void DoSomething()
{
int[] someArray = CreateArrayBasedOnFoo<int>() ;
...
return ;
}
public T[] CreateArrayBasedOnFoo<T>()
{
Foo[] values = (Foo[]) Enum.GetValues(typeof(Foo)) ;
int lo = (int) values.Min() ;
int hi = (int) values.Max() ;
int domain = ( hi - lo ) + 1 ;
T[] instance = (T[]) Array.CreateInstance( typeof(T), new int[]{domain} , new int[]{lo} ) ;
return instance ;
}
Метод CreateArrayBasedOnFoo<T>()
вернет массив, размер которого соответствует размеру перечисления, и нижняя граница которого является наименьшим значением изENUM.Например, если у вас есть 3 дискретных значения: 3, 5 и 7, массив, который будет возвращен, будет иметь длину 5 элементов и будет иметь нижнюю границу 3.