私は列挙型を持っています
public enum FileExtentions {
mp3,
mpeg
}
そして、拡張子が前の列挙型にあるかどうかを確認したい FileInfo があります。私はできることを望んでいた
FileExtensions.Any(e=>e.ToString().Equals(file.Extension));
しかし、それはあまりにも素晴らしかったでしょう。何か案は?
その理由とはAny
… Equals
?見落としていませContains
んか?
bool result = Enum.GetNames(typeof(FileExtensions)).Contains("mp3");
送信を押している間、私は自分で答えを考えました:
Enum.GetNames(typeof(FileExtensions)).Any(f=>f.Equals("."+file.Extension))
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);
次の拡張メソッドを使用して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();
System.Enumタイプを使用してこれを行うことができます。
string extension = Enum.GetName(typeof(FileExtensions), FileExtensions.mp3);
if (extension == file.Extension)
// do something here
アップデート:
ああ、私はあなたが拡張機能の列挙型全体をチェックしたいのであって、特定の列挙型の値が拡張機能と一致するのではないと誤解しました。その場合、GetNames()を使用したアプローチがルートです。申し訳ありませんが、自分の回答を自分の質問に受け入れられたものとしてマークすることはできません。;-)
最善の方法は、Enum.IsDefined 関数を使用することです。あなたの場合、それはかなり簡単です:
if (Enum.IsDefined(typeof(FileExtentions), file.Extension))