2013-04-17 2 views
3

У меня есть класс с 3-х типов перечисленийметод, который принимает несколько типов перечислений

Я хочу иметь метод, который может иметь все 3 из этих перечислений в качестве параметра и получить целое значение перечисления.

public enum Enum1 
{ 
    Fire = 0, 
    Hour_24 = 1, 
    Key_Switch = 2, 
    Follower = 3, 
    Entry_Delay1 = 4, 
    Entry_Delay2 = 5, 
    Intertior = 6, 
    Local_Only = 7, 
} 

public enum Enum2 
{ 
    Faulted = 0, 
    Tampered = 1, 
    Trouble = 2, 
    Bypassed = 3, 
    Inhibited = 4, 
    Low_Battery = 5, 
    Loss_Supervision = 6, 
    Reserved, 
    Alarm_Memory = 8, 
    Bypass_Memory = 9 
} 

private void BuildMessage() 
{ 
    List<Enum1> Enum1List = new List<Enum1>(); 
    FillBits(Enum1List); // => Here I get an error. 
} 

// This method should accept Enum1 and Enum2 
private Byte[] FillBits(List<Enum> EnumList) 
{ 
    foreach (Enum e in EnumList) 
    { 
     int value = Convert.ToInt32(e); 
    } 
} 

Как я могу это достичь?

Благодаря

+0

Enums не могут наследовать другие перечисления, использовать классы. Здесь вы можете увидеть, как: http://stackoverflow.com/a/757815/284240 –

+0

Не нужно использовать классы, он может использовать общий тип, как я описал ниже :) –

+0

@ KendeJong: Основная проблема заключается в том, что OP хочет передавать разные типы перечислений в один «List » на один метод. –

ответ

6

Просто использовать общий:

private Byte[] FillBits<T>(List<T> EnumList) 
     where T : struct, IConvertible 
{ 
    if (!typeof(T).IsEnum) 
    { 
     throw new ArgumentException("T must be an enumerated type"); 
    } 
    foreach (var e in EnumList) 
    { 
     int value = Convert.ToInt32(e); 
    } 
} 

Смотрите этот вопрос для использования общего и Enum вместе :

Create Generic method constraining T to an Enum

+0

+1 для ограничения – Silvermind

+0

Спасибо, это работает. –

2

Поскольку перечисление уже имеет значение INT, то почему бы не просто бросить его в целое?

+0

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

+0

Затем используйте классы или пропустите 3 списка перечислений и пройдите по каждому списку. – ferdyh

2

Попробуйте использовать объект, возможно? не

private void BuildMessage() 
{ 
    var enum1List = new List<object>(); 
    FillBits(enum1List); // => Here I get an error. 
} 

// This method should accept Enum1 and Enum2 
private Byte[] FillBits(IEnumerable<object> enumList) 
{ 
    foreach (Enum e in enumList) 
    { 
     int value = Convert.ToInt32(e); 
    } 
} 
2

Это должно работать (Нет проверки или что-то добавлено, только основные функциональные возможности):

private void BuildMessage() 
{ 
    List<Enum1> Enum1List = new List<Enum1>(); 
    Enum1List.Add(Enum1.Fire); 
    Enum1List.Add(Enum1.Follower); 
    FillBits(Enum1List); 
} 

private Byte[] FillBits<T>(List<T> enumList) 
{ 
    foreach (var e in enumList) 
    { 
     int value = Convert.ToInt32(e); 
    } 
} 
+0

Итак, вы можете использовать этот метод с любым типом? Это не сработает, если 'T' не конвертируется в int. И где вы используете другие типы перечислений? Он хочет использовать список со всеми типами перечислений не только 'Enum1'. –

+0

Как я уже сказал, в нем нет проверок, это просто базовые функции;) Есть способы сделать это безопасным для вас :) –

2
private Byte[] FillBits<T>(List<T> EnumList) where T: struct, IConvertable 
{ 
    foreach (Enum e in EnumList) 
    { 
     int value = Convert.ToInt32(e); 
    } 
} 

Поскольку вы не можете наследовать с Перечисления у вас нет реального способа обеспечения того, чтобы эта функция может быть вызвана только с List<Enum1>, List<Enum2> или List<Enum3> на уровне компиляции. У вас есть две реальные альтернативы

1) Время воспроизведения Тип проверки

private Byte[] FillBits<T>(List<T> EnumList) Where T:struct, IConvertable 
{ 
    if (typeof(T) != typeof(Enum1) && 
     typeof(T) != typeof(Enum2) && 
     typeof(T) != typeof(Enum3)) { 

     throw new <EXCEPTION OF YOUR CHOICE!>; 
    } 

    foreach (Enum e in EnumList) 
    { 
     int value = Convert.ToInt32(e); 
    } 
} 

Или переместить FillBits<T> в базовый класс, поэтому он не может быть вызван непосредственно и обеспечить защищенные перегрузкам.

private Byte[] PrivateFillBits<T>(List<T> EnumList) where T: struct, IConvertable 
{ ... } 

protected Byte[] FillBits(List<Enum1> EnumList) { 
    return this.PrivateFillBits(EnumList); 
} 

protected Byte[] FillBits(List<Enum2> EnumList) { 
    return this.PrivateFillBits(EnumList); 
} 

protected Byte[] FillBits(List<Enum3> EnumList) { 
    return this.PrivateFillBits(EnumList); 
} 
Смежные вопросы