16

我有一个枚举

public enum FileExtentions {
    mp3,
    mpeg
}

我有一个 FileInfo,我想检查扩展名是否在前一个枚举中。我希望我能做一个

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

但这太棒了。有任何想法吗?

4

7 回答 7

32

背后的原因是什么Any…… Equals?你忽略了Contains吗?

bool result = Enum.GetNames(typeof(FileExtensions)).Contains("mp3");
于 2008-11-30T00:53:54.297 回答
10

在按下提交时,我自己想到了答案:

Enum.GetNames(typeof(FileExtensions)).Any(f=>f.Equals("."+file.Extension))
于 2008-11-29T21:23:37.250 回答
2

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);
于 2008-11-30T01:22:41.603 回答
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();
于 2008-11-29T23:43:49.587 回答
0

您可以使用 System.Enum 类型来做到这一点:

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

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

更新:

啊,我误解了您要检查扩展的整个枚举,而不是特定的枚举值与扩展匹配。在这种情况下,您使用GetNames()的方法就是路线 - 抱歉,您无法将自己的答案标记为您自己的问题已接受。;-)

于 2008-11-29T21:25:47.010 回答
0

最好的方法是使用 Enum.IsDefined 函数。在您的情况下,这很容易:

if (Enum.IsDefined(typeof(FileExtentions), file.Extension))
于 2012-11-23T08:38:46.743 回答
0

一般解决方案:

Enum.IsDefined(Type, Object)

您的解决方案是:

Enum.IsDefined(typeof(FileExtentions), FileInfo)
于 2019-11-16T18:56:34.523 回答