Saya sudah membaca beberapa posting SO dan sepertinya sebagian besar operasi dasar hilang.
public enum LoggingLevel
{
Off = 0,
Error = 1,
Warning = 2,
Info = 3,
Debug = 4,
Trace = 5
};
if (s == "LogLevel")
{
_log.LogLevel = (LoggingLevel)Convert.ToInt32("78");
_log.LogLevel = (LoggingLevel)Enum.Parse(typeof(LoggingLevel), "78");
_log.WriteDebug(_log.LogLevel.ToString());
}
Ini tidak menyebabkan pengecualian, senang menyimpannya 78
. Apakah ada cara untuk memvalidasi nilai yang masuk ke enum?
Jawaban:
Lihat Enum. Sudah ditentukan
Pemakaian:
Ini adalah contoh dari halaman itu:
Contoh ini menampilkan output berikut:
sumber
LoggingLevel
digunakan sebagai penyimpanan, lalu sajikan sebagaiLoggingLevel
nilai enum.IsDefined
tidak berfungsi untuk anggota enum bitwised.Solusi di atas tidak berurusan dengan
[Flags]
situasi.Solusi saya di bawah ini mungkin memiliki beberapa masalah kinerja (saya yakin orang dapat mengoptimalkan dengan berbagai cara) tetapi pada dasarnya itu akan selalu membuktikan apakah nilai enum valid atau tidak .
Itu bergantung pada tiga asumsi:
int
, sama sekali bukan yang lain-
Memanggil
ToString()
enum mengembalikanint
nilai jika tidak ada enum (ditandai atau tidak) yang cocok. Jika nilai enum yang diizinkan cocok, itu akan mencetak nama yang cocok.Begitu:
Dengan mengingat dua aturan ini, kita dapat mengasumsikan bahwa jika .NET Framework melakukan tugasnya dengan benar, setiap panggilan ke
ToString()
metode enum yang valid akan menghasilkan sesuatu yang memiliki karakter alfabet sebagai karakter pertama:Orang bisa menyebutnya "retas", tetapi keuntungannya adalah dengan mengandalkan implementasi
Enum
dan standar C # Microsoft, Anda tidak mengandalkan kode atau cek yang berpotensi bermasalah. Dalam situasi di mana kinerja tidak terlalu kritis, ini akan menghemat banyakswitch
pernyataan jahat atau cek lainnya!Edit
Terima kasih kepada @ChaseMedallion untuk menunjukkan bahwa implementasi asli saya tidak mendukung nilai negatif. Ini telah diperbaiki dan tes disediakan.
Dan tes untuk mendukungnya:
sumber
[Flags]
memiliki nilai integer yang masuk akal.Jawaban kanoniknya adalah
Enum.IsDefined
, tetapi itu adalah: agak lambat jika digunakan dalam loop ketat, dan b: tidak berguna untuk[Flags]
enum.Secara pribadi, saya akan berhenti mengkhawatirkan hal itu, dan dengan
switch
tepat, mengingat:default:
(atau kosongkandefault:
penjelasan mengapa)default:
Seperti itu:
sumber
Menggunakan:
sumber
Gunakan Enum . Didefinisikan .
sumber
Untuk mengatasinya
[Flags]
Anda juga dapat menggunakan solusi ini dari C # Cookbook :Pertama, tambahkan
ALL
nilai baru ke enum Anda:Kemudian, periksa apakah nilainya ada di
ALL
:sumber
Salah satu cara untuk melakukannya adalah dengan mengandalkan casting dan enum untuk konversi string. Ketika casting int ke tipe Enum int dikonversi menjadi nilai enum yang sesuai atau enum yang dihasilkan hanya berisi int sebagai nilai jika nilai enum tidak didefinisikan untuk int.
Tidak diuji untuk setiap kasus tepi.
sumber
Seperti yang dikatakan orang lain,
Enum.IsDefined
kembalifalse
bahkan jika Anda memiliki kombinasi bit flag yang valid untuk enum yang dihiasi denganFlagsAttribute
.Sayangnya, satu-satunya cara untuk membuat metode yang mengembalikan true untuk flag bit yang valid agak panjang:
Anda mungkin ingin men-cache hasil
GetCustomAttribute
dalam kamus:Perhatikan bahwa kode di atas menggunakan
Enum
batasan baruT
yang hanya tersedia sejak C # 7.3. Anda harus mengirimkanobject value
versi yang lebih lama dan memanggilnyaGetType()
.sumber