Saya memiliki program yang harus menjalankan fungsi sesuai dengan Enum dan saya bertanya-tanya apakah ada cara lain selain ini:
enum FunctionType
{
Addition = 0,
Substraction = 1,
Mutiplication = 2,
Division = 3
}
void ExecuteFunction(FunctionType Function)
{
switch(Function)
{
case FunctionType.Addition: Addition();
break;
case FunctionType.Substraction: Subsctration();
break;
...
default: ...
}
}
(Ini bukan kode yang saya gunakan, ini hanya untuk mewakili apa yang ingin saya lakukan). Pendekatan ini seharusnya berfungsi dengan baik, tetapi apa yang terjadi jika Anda memiliki lebih banyak fungsi? Saya tidak ingin memiliki saklar 50 baris. Jadi saya ingin tahu apakah ada cara untuk menyederhanakannya, mungkin seperti ini:
enum FunctionType : Action
{
Addition = new Action(Addition);
Substraction = new Action(Substraction);
....
}
void ExecuteFunction(FunctionType Function)
{
(Action)Function.Invoke();
}
Tidak diperlukan saklar dan apa yang bisa berupa 50 baris berubah menjadi 1 baris. Namun hal ini tidak mungkin dilakukan, hanya tipe numerik yang diterima sebagai enum. Saya pikir mungkin untuk memiliki List<T>
tindakan tetapi itu memerlukan penambahan setiap tindakan ke daftar pada waktu runtime.
EDIT: Saya telah menemukan kode sumber cara melakukan hal ini, tetapi saya tidak dapat memahaminya. Inilah yang saya dapatkan: Mereka membuat Attribute
khusus yang berisi string
(Nama metode) dan metode yang mereka lakukan:
[CustomAtrribute("name")]
void Method()
{
}
Lalu saya tidak tahu bagaimana ini disebut dengan namanya, saya kira semacam refleksi, tetapi saya tidak tahu bagaimana menemukan info tentang ini.
EDIT2: Saya menemukan cara yang saya inginkan untuk melakukan ini, saya akan menambahkan antarmuka dengan suatu fungsi, kemudian mengimplementasikan antarmuka itu dengan kode di dalam fungsi dan Gunakan Dictionary<Enum, Interface>
untuk memanggilnya. Saya tidak tahu apakah saya harus menjawab pertanyaan saya sendiri, terima kasih kepada semua orang yang telah membantu saya.
Dictionary<FunctionType, Action>
... tetapi sekali lagi, Anda harus membangunnya pada waktu eksekusi. Jika semua nama metode cocok dengan nama nilai enum, Anda dapat melakukannya melalui refleksi. - person Jon Skeet   schedule 19.08.2016()
, tidak perlu melakukan.Invoke()
. Sekadar informasi - person vrwim   schedule 19.08.2016ExecuteFunction
Anda tidak hanya mengambilAction
atau apa pun? - person Jon Skeet   schedule 19.08.2016int
dan diuraikan ke dalam Enum. Dengan beberapa jenis paket yang berbeda, sebuah saklar akan baik-baik saja, tetapi ketika saya memperbarui program saya ingin menambahkan lebih banyak paket, dan saya ingin kodenya bersih, bukan saklar 50 kasus - person Pau C   schedule 19.08.2016