2009-12-28 12 views
76

Tôi gọi một phương pháp tĩnh Parse trên một loại thông qua phản ánh bởi vì tôi không biết loại đối tượng tại thời gian biên dịch (tôi biết, tuy nhiên, nó có một phương pháp Parse , lấy một chuỗi).Tránh một trận đấu ngoại lệ mơ hồ

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

Làm cách nào tôi có thể cụ thể hơn trong lời gọi phương pháp để đảm bảo tôi tiếp cận đúng phương pháp (Phân tích cú pháp (chuỗi s)) và ngoại lệ không được 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" }); 

Trả lời

139

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

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

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

+7

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 thích. Bạn đã nhận xét dọc theo dòng "Tôi muốn sử dụng chiếc xe đạp này, nếu nó hơi xanh hơn". Điều này 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ự nhập loại Array 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 giả định rằng bạn nhận xét về phong cách (cả hai hoạt động) trong khi có khả năng suy nghĩ đoạn mã là sai (nó không phải là). –

+1

Cảm ơn câu trả lời, các bạn. Để lưu các chàng tiếp theo một số rắc rối, cho các loại tài liệu tham khảo, sử dụng một cái gì đó như thế này: typeof (string) .MakeByRefType(); – BRebey

-2
if (assembly != null) 
{ 
    List<System.Reflection.MethodInfo> mInfo = new List<System.Reflection.MethodInfo>(); 
    Type myType = null; 

    foreach (Type item in assembly.GetTypes()) 
    { 
    mInfo.Clear(); 
    mInfo = item.GetMethods().ToList(); 
    foreach (System.Reflection.MethodInfo item2 in mInfo) 
    { 
     if (item2.Name == methodName) 
     { 
     Method = item2; 
     break; 
     } 
    } 
    } 

    stateInstance = Activator.CreateInstance(myType); 
} 
return Method; 
+0

'Method' đến từ đâu? Nó sẽ không làm tổn thương để giải thích một chút những gì mã của bạn không. – LarsTech

+4

Có, vui lòng tránh chỉ trả lời mã. Thêm một số giải thích về những gì đang diễn ra hoặc tại sao câu trả lời của bạn có thể hữu ích. –