2012-04-02 5 views
9

Tôi có thể sử dụng Type.InvokeMember để gọi phương thức qua phản xạ và có vẻ khá mạnh mẽ, xử lý thông số mảng param chẳng hạn. Tuy nhiên, vì lý do nào đó, nó không xử lý các tham số tùy chọn.Gọi phương thức với các tham số tùy chọn thông qua sự phản chiếu

Có cách tiếp cận tích hợp nào tốt hơn để gọi phương thức (có lẽ sử dụng DLR) có tính đến các tham số tùy chọn không?

+0

Bạn có thể gọi type.GetMethod (...) để lấy một thể hiện MethodInfo. Sau đó, bạn có thể gọi methodInfo.Invoke(), với các tham số tùy chọn, bạn có thể vượt qua Type.Missing –

+0

Nhưng điều này đòi hỏi tôi phải nỗ lực lặp lại tất cả các trường hợp có thể của phương thức và làm việc nếu các tham số của tôi phù hợp với tùy chọn thông số. Về cơ bản làm ràng buộc bằng tay đó là những gì tôi đang làm vào lúc này. Có vẻ như Type.InvokeMember chạy 90% và sau đó thất bại. Nhìn vào bản sao nó xuất hiện tôi đang mắc kẹt làm nó bằng tay cho bây giờ. –

Trả lời

5

Trong ví dụ sau, chúng tôi đang gọi một hàm có hai tham số trả về không có gì. Tham số thứ hai là tùy chọn.

MethodInfo mi = default(MethodInfo); 

// Loading the assembly 
Assembly reflectionAssemby = Assembly.LoadFile(@"C:\RelectionDLL.dll"); 

// Get type of class from loaded assembly 
Type reflectionClassType = reflectionAssemby.GetType("ReflectionDLL.ReflectionClass"); 

// Create instance of the class 
object objReflection = Activator.CreateInstance(reflectionClassType); 

mi = reflectionClassType.GetMethod("pub_Inst_NoReturn_Function"); 
mi.Invoke(objReflection, new object[] { value1, Type.Missing }); 
+1

Cảm ơn bạn đã phản hồi. Vấn đề với điều này là tôi vẫn cần phải thâm nhập vào siêu dữ liệu để xác định rằng tham số tùy chọn tồn tại để tôi có thể vượt qua Type.Missing. Tôi đã hy vọng cho một giải pháp mà về cơ bản nhân rộng khả năng ràng buộc của trình biên dịch C# lúc chạy. –

+0

@JamesGaunt Bài đăng cũ, nhưng cuối cùng bạn có tìm được cách nào đó không? –

+0

Wow có rất cũ ... Tôi đã làm loại tìm một cách ... nhưng chỉ bằng cách sử dụng trình biên dịch Roslyn để biên dịch C# trực tiếp chống lại các phụ thuộc cần thiết tại thời gian chạy. Vì vậy, không thực sự giải quyết cùng một vấn đề. Nhưng có lẽ có nhiều cách để sử dụng các tính năng biên dịch mới để biên dịch một số mã mẫu và sau đó kiểm tra AST để xem những gì nó đã kết thúc ràng buộc quá. –