2015-05-07 3 views
0

В моем проекте MVC У меня есть MyEnum:Как определить тип перечисления, переданный Enum []

public enum MyEnum 
{ 
    a, 
    b, 
    c, 
    d 
} 

У меня есть класс:

public class MyClass 
{  
    public MyEnum SelectType { get; set; } 

    public Enum[] NotSupportedTypes{ get; set; } 
} 

В моем классе NotSupportedTypes я могу использовать толькоEnum[] type.

Когда я создаю объект класса MyClass, как я могу проверить, что в NotSupportedTypes перечислены только перечисления типа MyEnum?

var model = new MyClass(); 

//good 
model.NotSupportedTypes = new Enum[] { MyEnum.a } 

//bad 
model.NotSupportedTypes = new Enum[] { SomeOtherEnum.a } 
+3

Почему вы не используете 'MyEnum []' вместо 'Enum []' then? –

+0

Почему вы можете использовать 'Enum []'? Это похоже на корень проблемы. – juharr

+0

@juharr Технически даже использование 'MyEnum' ничего не решит ...' NotSupportedTypes = new MyEnume [] {(MyEnum) -1} ' – xanatos

ответ

1

Вы можете проверить его в собственность, например, с Array.TrueForAll:

private Enum[] _NotSupportedTypes; 
public Enum[] NotSupportedTypes 
{ 
    get { return _NotSupportedTypes; } 
    set { 
     if (!Array.TrueForAll(value, x => x.GetType() == typeof(MyEnum))) 
      throw new ArgumentException("All enums must be MyEnum"); 
     _NotSupportedTypes = value; 
    } 
} 

Как отметил Ксанатосом это не защитит вас от изменений в массиве. Таким образом, вы можете заменить один MyEnum с ним другим типом перечисления позже. Массивы не являются readonly.

Так почему бы вам не использовать MyEnum[]?

+0

И даже это не защитит от изменений в' NotSupportedTypes' ... В массивах C# можно Не читайте. Он также не защитит от «незаконных» значений MyEnum. – xanatos

+0

@xanatos: хорошая точка, упомянутая в ответе. –

0
var model = new MyClass(); 

//good 
//model.NotSupportedTypes = new Enum[] { MyEnum.a } 

//bad 
model.NotSupportedTypes = new Enum[] { SomeOtherEnum.a } 

var validTypes = model.NotSupportedTypes.All(n => n.GetType() == typeof(MyEnum)); 
Смежные вопросы