среда, 13 августа 2008 г.

Перечислимые типы и поля

Дорогой блог!

Сегодня я расскажу тебе о том, как получить сразу все поля перечислимого типа. Чтобы не путать тебя, дневник, я сразу расскажу, какой перечислимый тип у нас будет:
public enum MyEnum
{
Field,
AnotherField,
OneMore
}

Когда я был совсем маленьким и неумным я делал так:
public MyEnum[] GetMyEnumValues()
{
return new MyEnum[] {
MyEnum.Field,
MyEnum.AnotherField,
MyEnum.OneMore
};
}

Но если я или другой программист когда-нибудь добавит поле в перечислимый тип, или наоборот уберет его, или просто изменит его название, все сломается. Поэтому так делать плохо и так делают только плохие программисты. А хорошие программисты всегда делают так:

public IList<MyEnum> MyEnumFields
{
get
{
IList<MyEnum> result = new IList<MyEnum>();
MyEnum values = MyEnum.Field;

foreach(FieldInfo field in typeof(MyEnum).GetFields())
if (field.FieldType.Equals(typeof(MyEnum)))
result.Add((MyEnum)field.GetValue(value));

return result;
}
}

Дорогоуважаемые программисты! Пожалуйста будьте только хорошими и не расстраивайте своих коллег, и аналитиков, и менеджеров. Обращайтесь с типами правильно и изучайте типы.

До скорых встреч!

5 комментариев:

Michael комментирует...

Чет очень сложно как-то.

string[] zNames = Enum.GetNames(typeof(XEAction));
Array values = Enum.GetValues(typeof(XEAction));

Андрей комментирует...

я ждал, когда кто-нибудь скажет это :)

Michael комментирует...

А в чем подвох? :)

Андрей комментирует...

ты не поверишь :)
ни в чем, кроме того, что GetFields работает для чего угодно, а GetValues -- только для енумов

Michael комментирует...

Ну ладно :)