Tránh một ngoại lệ phù hợp mơ hồ


115

Tôi đang gọi một phương thức tĩnh Phân tích cú pháp trên một loại thông qua sự phản chiếu bởi vì tôi không biết loại đối tượng tại thời gian biên dịch (tuy nhiên, tôi biết, tuy nhiên, nó có một phương thức Parse , lấy một chuỗi).

Tuy nhiên, tôi nhận được một ngoại lệ đối sánh không rõ ràng, có lẽ vì có rất nhiều phương thức Parse bị quá tải, mỗi phương thức lấy một đối tượng (chuỗi, int, double, v.v.).

Làm thế nào tôi có thể cụ thể hơn trong lời gọi phương thức của mình để đảm bảo tôi đạt được phương thức chính xác ( Parse (chuỗi s) ) và ngoại lệ không bị ném.

Mã của tôi trông như thế này:

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

Câu trả lời:


193

Sử dụng quá tải này và sử dụng

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

9
@Bitterblue Tôi bối rối tại sao bạn viết bình luận đó - và tại sao bạn xem xét các vấn đề về phong cách đáng để thảo luận?
Benjamin Podszun

9
Bài thuyết trình là tốt, nó chỉ xảy ra theo một phong cách khác với phong cách bạn có vẻ thích. Bạn đã bình luận dọc theo dòng chữ "Tôi sẽ sử dụng chiếc xe đạp này, nếu nó có màu hơi xanh hơn". Mà làm tôi bối rối. Chỉnh sửa nhận xét: Trừ khi bạn không biết rằng [] {} mới thực sự xâm nhập vào loại Mảng và IS tương đương với Loại mới [] trong trường hợp này? Trong trường hợp đó, tôi xin lỗi - Tôi cho rằng bạn nhận xét về phong cách (cả hai tác phẩm) trong khi có khả năng nghĩ đoạn trích là sai (không phải vậy).
Benjamin Podszun

1
Cảm ơn câu trả lời, các bạn. Để cứu anh chàng tiếp theo một số rắc rối, đối với các loại tham chiếu, hãy sử dụng một cái gì đó như thế này: typeof (chuỗi) .MakeByRefType ();
BRebey

5
@Bitterblue Tôi không 'trẻ' và điều đó chắc chắn là âm thanh hạ thấp. Một lập trình viên không thể đọc new [] { typeof(string) }có vấn đề khác ngoài việc duy trì mã. Các loại nghĩa đen là đúng ở đó. Ngoài ra, 'điên một lớp' không liên quan, phong cách ưa thích của bạn chỉ cần thêm các chữ cái thừa vào chính dòng này. Tôi cho rằng điều đó new Type[] {...}ít đọc hơn, bởi vì dòng này dài hơn và đó là thông tin không liên quan / nồi hơi / tiếng ồn. Do đó: Đó là vấn đề về phong cách và bạn bắt đầu cuộc thảo luận với một kẻ gây hấn thụ động 'sẽ được nâng cao, nếu nó phù hợp với sở thích của tôi' ..
Benjamin Podszun

2
Hãy cẩn thận, nó sẽ không hoạt động nếu 2 phương thức có cùng tên, cùng số lượng tham số và cùng loại tham số. Tôi đang suy nghĩ ở đây về quá tải diễn viên diễn viên rõ ràng. Ví dụ public static explicit double(MyType obj)public static explicit float(MyType obj). Bạn vẫn sẽ có một AmbiguousMatchException. Trong trường hợp này, bạn có thể sử dụng returnType.GetMethods().SingleOrDefault(m => m.Name == "op_Explicit" && m.ReturnType == typeof(float))ví dụ.
Guillaume
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.