2010-04-26 27 views
8

Tôi đang gặp sự cố khi tạo tập hợp đại biểu bằng cách sử dụng phản chiếu và Generics.Delegate.CreateDelegate() và generics: Lỗi ràng buộc với phương pháp nhắm mục tiêu

Tôi đang cố tạo bộ sưu tập đại biểu từ phương thức Ally, có chia sẻ chữ ký phương thức chung.

public class Classy 
{ 
    public string FirstMethod<T1, T2>(string id, Func<T1, int, IEnumerable<T2>> del); 
    public string SecondMethod<T1, T2>(string id, Func<T1, int, IEnumerable<T2>> del);  
    public string ThirdMethod<T1, T2>(string id, Func<T1, int, IEnumerable<T2>> del); 

    // And so on... 
} 

Và Generics nấu:

// This is the Classy's shared method signature  
public delegate string classyDelegate<out T1, in T2>(string id, Func<T1, int, IEnumerable<T2>> filter); 


// And the linq-way to get the collection of delegates from Classy 
( 
    from method in typeof(Classy).GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.NonPublic) 
    let delegateType = typeof(classyDelegate<,>) 
    select Delegate.CreateDelegate(delegateType, method) 
).ToList(); 

Nhưng Delegate.CreateDelegate(delegateType, method) ném một ArgumentException nói Lỗi ràng buộc để nhắm mục tiêu phương pháp. :/

Tôi đang làm gì sai?

Trả lời

16

Đó là do quá tải của Delegate.CreateDelegate chỉ hỗ trợ tạo đại biểu trỏ đến phương pháp tĩnh. Nếu bạn muốn liên kết với các phương thức instance, bạn cũng cần phải truyền vào thể hiện mà delegate đã tạo của bạn được gọi là phương thức.

Bạn có thể muốn:

from method in typeof(Classy).GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.NonPublic) 
let delegateType = typeof(classyDelegate<,>) 
select Delegate.CreateDelegate(delegateType, yourInstance, method) 

Ngoài ra, ví dụ mã của bạn sẽ không biên dịch. Bạn không thể khai báo phương sai trên các chữ ký phương thức; và bạn không thể bỏ qua việc triển khai trong một lớp không trừu tượng.

Cuối cùng, Delegate.CreateDelegate tạo một đại biểu thể hiện, không thể tồn tại mà không biết thông số loại của nó. Do đó, bạn không thể liên kết với classyDelegate <,>, bạn cần phải biết các loại thực tế có liên quan.

+0

Xin chào Driis! cảm ơn bạn đã trả lời. Bạn có ý nghĩa gì với 'Bạn không thể khai báo phương sai trên chữ ký phương thức'? – SDReyes

+3

Anh ấy có nghĩa là từ khóa 'out' và' in' trên các đối số chung của bạn. – gix

+1

Tôi có nghĩa là bạn không thể có và sửa đổi trên chữ ký phương thức của bạn trong lớp học. Bạn chỉ có thể có chúng trên các khai báo ủy nhiệm và giao diện. – driis

Các vấn đề liên quan