การหลีกเลี่ยงข้อยกเว้นการจับคู่ที่คลุมเครือ


116

ฉันกำลังเรียกใช้วิธีการแบบคงที่แยกวิเคราะห์ประเภทผ่านการสะท้อนเพราะฉันไม่ทราบประเภทของวัตถุในเวลาคอมไพล์ (ฉันรู้ว่ามันมีวิธีการแยกวิเคราะห์โดยใช้สตริง)

อย่างไรก็ตามฉันได้รับข้อยกเว้นการจับคู่ที่คลุมเครือซึ่งน่าจะเป็นเพราะมีวิธีการแยกวิเคราะห์ที่มากเกินไปซึ่งแต่ละวิธีใช้วัตถุชิ้นเดียว (สตริง, int, คู่ ฯลฯ )

ฉันจะเจาะจงมากขึ้นในการเรียกใช้เมธอดของฉันได้อย่างไรเพื่อให้แน่ใจว่าฉันไปถึงวิธีการที่ถูกต้อง ( แยกวิเคราะห์ (สตริง s) ) และข้อยกเว้นจะไม่ถูกโยนทิ้ง

รหัสของฉันมีลักษณะดังนี้:

Type returnType = p.PropertyType;
object value = returnType.GetMethod("Parse").Invoke(null, new string[] { "1" });

คำตอบ:


194

ใช้เกินขนาดนี้แล้วใช้

returnType.GetMethod("Parse", new [] {typeof(string)})

9
@Bitterblue ฉันสับสนว่าทำไมคุณถึงเขียนความคิดเห็นนั้น - และทำไมคุณถึงพิจารณาเรื่องของสไตล์ที่ควรค่าแก่การพูดคุย?
Benjamin Podszun

9
การนำเสนอเป็นเรื่องปกติ แต่จะเป็นไปตามสไตล์ที่แตกต่างจากที่คุณต้องการ คุณแสดงความคิดเห็นตลอดแนวว่า "ฉันจะใช้โรงเก็บจักรยานนี้ถ้าเป็นสีฟ้ากว่านี้อีกหน่อย" ซึ่งทำให้ฉันสับสน การแก้ไขความคิดเห็น: เว้นแต่คุณจะไม่ทราบว่า [] {} ใหม่จะอนุมานประเภทของ Array และISเทียบเท่ากับ Type [] ใหม่ในกรณีนี้หรือไม่ ในกรณีนี้ฉันขอโทษ - ฉันคิดว่าคุณแสดงความคิดเห็นเกี่ยวกับสไตล์ (ทั้งสองผลงาน) ในขณะที่อาจคิดว่าตัวอย่างข้อมูลไม่ถูกต้อง (ไม่ใช่)
Benjamin Podszun

1
ขอบคุณสำหรับคำตอบครับ เพื่อช่วยคนถัดไปมีปัญหาสำหรับประเภทการอ้างอิงให้ใช้สิ่งนี้: typeof (string) .MakeByRefType ();
BRebey

5
@Bitterblue ฉันไม่ใช่ 'เด็ก' และนั่นก็ฟังดูกลมกลืน โปรแกรมเมอร์ที่อ่านไม่ออกnew [] { typeof(string) }มีปัญหาอื่นนอกเหนือจากการดูแลรักษาโค้ด ประเภทอยู่ที่นั่นอย่างแท้จริง นอกจากนี้ 'one-liners ที่บ้าคลั่ง' ไม่เกี่ยวข้องสไตล์ที่คุณต้องการเพียงแค่เพิ่มตัวอักษรซ้ำซ้อนลงในบรรทัดนี้ ฉันขอยืนยันว่าnew Type[] {...}อ่านได้น้อยลงเนื่องจากบรรทัดยาวขึ้นและเป็นข้อมูลที่ไม่เกี่ยวข้อง / ต้นแบบ / เสียงรบกวน ดังนั้น: มันเป็นเรื่องของสไตล์และคุณเริ่มต้นการสนทนาด้วยความก้าวร้าวเชิงรุก 'จะมีการโหวตเพิ่มขึ้นถ้ามันจะตอบสนองรสนิยมของฉัน' ..
Benjamin Podszun

2
ระวังจะใช้ไม่ได้หาก 2 เมธอดมีชื่อเดียวกันจำนวนพารามิเตอร์เท่ากันและพารามิเตอร์ประเภทเดียวกัน ฉันคิดที่นี่เกี่ยวกับตัวดำเนินการแคสต์ที่ชัดเจนเกินพิกัด ตัวอย่างเช่นpublic static explicit double(MyType obj)และpublic static explicit float(MyType obj). คุณจะยังคงมีAmbiguousMatchExceptionไฟล์. ในกรณีนี้คุณสามารถใช้returnType.GetMethods().SingleOrDefault(m => m.Name == "op_Explicit" && m.ReturnType == typeof(float))ตัวอย่างเช่น
Guillaume
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.