Saya memiliki enumerasi:
public enum MyColours
{
Red,
Green,
Blue,
Yellow,
Fuchsia,
Aqua,
Orange
}
dan saya punya string:
string colour = "Red";
Saya ingin dapat kembali:
MyColours.Red
dari:
public MyColours GetColour(string colour)
Sejauh ini saya punya:
public MyColours GetColours(string colour)
{
string[] colours = Enum.GetNames(typeof(MyColours));
int[] values = Enum.GetValues(typeof(MyColours));
int i;
for(int i = 0; i < colours.Length; i++)
{
if(colour.Equals(colours[i], StringComparison.Ordinal)
break;
}
int value = values[i];
// I know all the information about the matched enumeration
// but how do i convert this information into returning a
// MyColour enumeration?
}
Seperti yang Anda lihat, saya agak macet. Apakah ada untuk memilih enumerator berdasarkan nilai. Sesuatu seperti:
MyColour(2)
akan menghasilkan
MyColour.Green
c#
string
enumeration
Matt Clarkson
sumber
sumber
Jawaban:
lihat System.Enum.Parse:
sumber
Anda bisa memasukkan int ke enum
Ada juga opsi Enum.Parse
sumber
Diberikan perubahan terbaru dan terhebat untuk .NET (+ Core) dan C # 7, berikut adalah solusi terbaik:
variabel warna dapat digunakan dalam lingkup Enum.TryParse
sumber
Yang Anda butuhkan adalah Enum.Parse .
sumber
Saya menandai jawaban OregonGhost +1, kemudian saya mencoba menggunakan iterasi dan menyadari bahwa itu tidak tepat karena Enum.GetNames mengembalikan string. Anda ingin Enum.GetValues:
sumber
Anda dapat menggunakan
Enum.Parse
untuk mendapatkan nilai enum dari nama. Anda bisa mengulangi semua nilai denganEnum.GetNames
, dan Anda bisa langsung memberikan int ke enum untuk mendapatkan nilai enum dari nilai int.Seperti ini, misalnya:
atau:
Yang terakhir akan melempar ArgumentException jika nilainya tidak ditemukan, Anda mungkin ingin menangkapnya di dalam fungsi dan mengembalikan nilai default.
sumber
sumber
Parse
metode generik .Seperti yang disebutkan dalam jawaban sebelumnya, Anda dapat melemparkan langsung ke tipe data yang mendasari (tipe int -> enum) atau parse (string -> tipe enum).
tapi hati-hati - tidak ada .TryParse untuk enum, jadi Anda AKAN membutuhkan blok coba / tangkap di sekitar parse untuk menangkap kegagalan.
sumber
sumber
Satu hal yang mungkin berguna bagi Anda (selain jawaban yang sudah valid / baik yang diberikan sejauh ini) adalah ide StringEnum yang disediakan di sini
Dengan ini, Anda dapat mendefinisikan enumerasi sebagai kelas (contohnya ada di vb.net):
Dan sekarang Anda bisa menggunakan kelas ini karena Anda akan menggunakan enum: eAuthenticationMethod.WindowsAuthentication dan ini pada dasarnya seperti menetapkan ' W ' nilai logis WindowsAuthentication (di dalam enum) dan jika Anda melihat nilai ini dari properti jendela (atau sesuatu yang lain yang menggunakan properti System.ComponentModel.Description) Anda akan mendapatkan " Gunakan Windows Authentication ".
Saya telah menggunakan ini untuk waktu yang lama sekarang dan itu membuat kode lebih jelas maksudnya.
sumber
sumber
Anda mungkin juga ingin memeriksa beberapa saran di posting blog ini: Teman kecil baru saya, Enum <T>
Posting ini menjelaskan cara untuk membuat kelas pembantu umum yang sangat sederhana yang memungkinkan Anda untuk menghindari sintaksis jelek yang melekat dengan
Enum.Parse
- alih-alih Anda akhirnya menulis sesuatu seperti ini dalam kode Anda:Atau periksa beberapa komentar di pos yang sama yang berbicara tentang menggunakan metode ekstensi untuk mencapai yang serupa.
sumber