Проверьте, имеет ли перечисление поле, равное строке

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

public enum FileExtentions {
    mp3,
    mpeg
}

И у меня есть FileInfo, из которого я хочу проверить, находится ли расширение в предыдущем перечислении. Я надеялся, что смогу сделать

FileExtensions.Any(e=>e.ToString().Equals(file.Extension));

Но это было бы слишком круто. Любые идеи?

Ответ 1

В чем причина Any... Equals? Вы не заметили Contains?

bool result = Enum.GetNames(typeof(FileExtensions)).Contains("mp3");

Ответ 2

Нажав кнопку submit, я подумал об ответе:

Enum.GetNames(typeof(FileExtensions)).Any(f=>f.Equals("."+file.Extension))

Ответ 3

Вы можете расширить тип FileInfo следующим способом расширения:

public static bool HasExtension(this FileInfo file)
{
    var ext = file.Extension.StartsWith(".") ? file.Extension.Substring(1) 
                                             : file.Extension;

    return Enum.GetNames(typeof(FileExtensions))
               .Any(f => f.Equals(ext));
}

и используйте его как:

bool hasExtension = file.HasExtension();

Ответ 4

Вы можете сделать это с помощью типа System.Enum:

string extension = Enum.GetName(typeof(FileExtensions), FileExtensions.mp3);

if (extension == file.Extension)
  // do something here

Update:

А, я неправильно понял, что вы хотите проверить все перечисление для расширения, а не то, что конкретное значение перечисления соответствует расширению. В этом случае ваш подход с GetNames() является маршрутом - извините, вы не можете пометить свой собственный ответ как принятый для вашего собственного вопроса.; -)

Ответ 5

Enum.IsDefined примет строку, содержащую имя значения перечисления. Единственное уродство в том, что вам нужно снять основной период с File.Extension и с учетом регистра:

Enum.IsDefined(typeof(FileExtension), file.Extension.Substring(1).ToLower())

Изменить: добротность расширения, чтобы приблизиться к вашему желаемому синтаксису:

IEnumerable<string> GetNames(this Type t) {
   if (!t.IsEnum) throw new ArgumentException();

   return Enum.GetNames(t);
}

typeof(FileExtensions).GetNames().Any(e=>e.ToString().Equals(file.Extension));

Лично я все же предпочитаю маршрут IsDefined:

bool IsDefined(this Type t, string name) {
   if (!t.IsEnum) throw new ArgumentException();

   return Enum.IsDefined(t, name);
}

typeof(FileExtension).IsDefined(file.Extension);

Ответ 6

Лучший способ - использовать функцию Enum.IsDefined. Это довольно легко, в вашем случае:

if (Enum.IsDefined(typeof(FileExtentions), file.Extension))