ฉันมีโปรแกรมที่ต้องรันฟังก์ชันตาม Enum และฉันสงสัยว่ามีวิธีอื่นนอกเหนือจากนี้หรือไม่:
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: ...
}
}
(นี่ไม่ใช่รหัสที่ฉันใช้ แต่เป็นเพียงเพื่อแสดงสิ่งที่ฉันต้องการทำ) วิธีการนี้น่าจะได้ผลดี แต่จะเกิดอะไรขึ้นเมื่อคุณมีฟังก์ชันมากกว่านี้อีกมาก? ฉันไม่อยากมีสวิตช์ 50 เส้น ผมอยากทราบว่ามีวิธีทำให้มันง่ายขึ้นหรือเปล่า อะไรประมาณนี้:
enum FunctionType : Action
{
Addition = new Action(Addition);
Substraction = new Action(Substraction);
....
}
void ExecuteFunction(FunctionType Function)
{
(Action)Function.Invoke();
}
ไม่จำเป็นต้องใช้สวิตช์ และสิ่งที่อาจเป็น 50 บรรทัดก็จะกลายเป็น 1 บรรทัด แต่ทำไม่ได้ มีเพียงประเภทตัวเลขเท่านั้นที่ยอมรับเป็นแจงนับ ฉันคิดว่าเป็นไปได้ที่จะมีการกระทำ List<T>
แต่จะต้องเพิ่มแต่ละการกระทำลงในรายการในขณะรันไทม์
แก้ไข: ฉันพบวิธีการในซอร์สโค้ดแล้ว แต่ฉันไม่เข้าใจมันจริงๆ นี่คือสิ่งที่ฉันได้รับ: พวกเขาสร้าง Attribute
แบบกำหนดเองที่มี string
(ชื่อวิธีการ) และในวิธีการที่พวกเขาทำ:
[CustomAtrribute("name")]
void Method()
{
}
ถ้าอย่างนั้นฉันก็ไม่รู้ว่าชื่อนี้ถูกเรียกอย่างไร ฉันเดาว่ามันคงเป็นความรู้สึกบางอย่าง แต่ฉันไม่รู้ว่าจะหาข้อมูลเกี่ยวกับเรื่องนี้ได้อย่างไร
แก้ไข 2: ฉันพบวิธีที่ฉันต้องการทำสิ่งนี้ ฉันจะเพิ่มอินเทอร์เฟซพร้อมฟังก์ชัน จากนั้นใช้อินเทอร์เฟซนั้นกับโค้ดภายในฟังก์ชัน และใช้ Dictionary<Enum, Interface>
เพื่อเรียกมัน ฉันไม่รู้ว่าฉันควรตอบคำถามของตัวเองดีหรือไม่ ขอบคุณทุกคนที่ช่วยฉัน
Dictionary<FunctionType, Action>
... แต่อีกครั้ง คุณจะต้องสร้างมันขึ้นมาในเวลาดำเนินการ หากชื่อวิธีการทั้งหมดตรงกับชื่อค่า enum คุณสามารถทำได้ผ่านการไตร่ตรอง - person Jon Skeet   schedule 19.08.2016()
โดยไม่จำเป็นต้องทำ.Invoke()
แค่ไฟนี่ - person vrwim   schedule 19.08.2016ExecuteFunction
ของคุณจึงไม่เพียงแค่ใช้Action
หรืออะไรก็ตาม - person Jon Skeet   schedule 19.08.2016int
และแยกวิเคราะห์เป็น Enum ด้วยแพ็กเก็ตที่แตกต่างกันสองสามประเภท สวิตช์ก็น่าจะใช้ได้ แต่เมื่อฉันอัปเดตโปรแกรม ฉันต้องการเพิ่มแพ็กเก็ตเพิ่มเติม และฉันต้องการให้โค้ดสะอาด ไม่ใช่สวิตช์ขนาด 50 ตัว - person Pau C   schedule 19.08.2016