Проверьте, имеет ли перечисление поле, равное строке - PullRequest
15 голосов
/ 30 ноября 2008

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

public enum FileExtentions {
    mp3,
    mpeg
}

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

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

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

Ответы [ 6 ]

28 голосов
/ 30 ноября 2008

В чем причина AnyEquals? Вы пропустили Contains?

bool result = Enum.GetNames(typeof(FileExtensions)).Contains("mp3");
8 голосов
/ 30 ноября 2008

Нажав кнопку «Отправить», я сам подумал над ответом:

Enum.GetNames(typeof(FileExtensions)).Any(f=>f.Equals("."+file.Extension))
1 голос
/ 30 ноября 2008

Вы можете расширить тип 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();
0 голосов
/ 23 ноября 2012

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

if (Enum.IsDefined(typeof(FileExtentions), file.Extension))
0 голосов
/ 30 ноября 2008

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);
0 голосов
/ 30 ноября 2008

Это можно сделать с помощью типа System.Enum:

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

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

Обновление:

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

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