我有一个枚举
public enum FileExtentions {
mp3,
mpeg
}
我有一个FileInfo,我想检查扩展名是否在上一个枚举中。 我希望我能做一个
FileExtensions.Any(e=>e.ToString().Equals(file.Extension));
但那太棒了。 有什么想法吗?
答案 0 :(得分:28)
Any
... Equals
背后的原因是什么?你忽略了Contains
吗?
bool result = Enum.GetNames(typeof(FileExtensions)).Contains("mp3");
答案 1 :(得分:8)
在按提交时,我自己想到了答案:
Enum.GetNames(typeof(FileExtensions)).Any(f=>f.Equals("."+file.Extension))
答案 2 :(得分:1)
您可以使用以下扩展方法扩展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();
答案 3 :(得分:0)
您可以使用System.Enum类型执行此操作:
string extension = Enum.GetName(typeof(FileExtensions), FileExtensions.mp3);
if (extension == file.Extension)
// do something here
<强>更新强>
啊,我误解了你想检查扩展的整个枚举,而不是特定的枚举值与扩展名匹配。在这种情况下,使用 GetNames()的方法就是路线 - 抱歉,您无法将自己的答案标记为您自己的问题。 ; - )
答案 4 :(得分:0)
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);
答案 5 :(得分:0)
最好的方法是使用Enum.IsDefined函数。在你的情况下,这很容易:
if (Enum.IsDefined(typeof(FileExtentions), file.Extension))
答案 6 :(得分:0)
一般解决方案:
Enum.IsDefined(Type, Object)
您的解决方案是:
Enum.IsDefined(typeof(FileExtentions), FileInfo)