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

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

public enum FileExtentions {
 mp3,
 mpeg
}

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

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

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

6 ответов

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

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


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

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


Вы можете расширить тип 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();


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

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


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

string extension = Enum.GetName(typeof(FileExtensions), FileExtensions.mp3);
if (extension == file.Extension)
 // do something here

Update:

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


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));
</string>

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

bool IsDefined(this Type t, string name) {
 if (!t.IsEnum) throw new ArgumentException();
 return Enum.IsDefined(t, name);
}
typeof(FileExtension).IsDefined(file.Extension);

licensed under cc by-sa 3.0 with attribution.