2011-01-19 39 views
7

Tôi có một MethodInfo của GenericMethodDefinition. Chẳng hạn như: CallMethod<T>(T arg, string arg2). Phương thức GetParameters() sẽ cho tôi hai đối tượng ParameterInfo, cái đầu tiên trong số đó là generic, cái thứ hai không phải là. Làm thế nào tôi có thể nhận được ParameterInfo để cho tôi biết nó là chung? Điều gì về nếu nó có khó khăn?Cách xác định xem ParameterInfo có thuộc loại chung không?

+1

nhờ các mod để tạo thẻ parameterinfo – smartcaveman

Trả lời

7

Kiểm tra ParameterType.IsGenericParameter.
Bạn cũng có thể muốn kiểm tra ContainsGenericParameters, điều này sẽ đúng đối với một số nội dung như MyMethod<T>(List<T> param). (Mặc dù List<> không phải là một tham số chung)

Nếu IsGenericParameter là đúng, bạn cũng có thể gọi GetGenericParameterConstraints() để có được giao diện hoặc loại cơ sở ràng buộc, và bạn có thể kiểm tra GenericParameterAttributes (một enum [Flags]) cho new(), struct, hoặc class ràng buộc.

+0

những hạn chế về tham số chung? – smartcaveman

+0

Trong trường hợp 'args' là một mảng' T [] ', ta có thể sử dụng' ParameterType.IsArray' và 'ParameterType.ContainsGenericParameter'. – user492238

1

lẽ here bạn sẽ tìm thấy thông tin về phản ánh các thông số chung chung ...

3

Tôi nghĩ rằng bạn đang tìm kiếm những:

parameterInfo.ParameterType.ContainsGenericParameters 
parameterInfo.ParameterType.GetGenericParameterConstraints() 
2

Trong bổ sung cho câu trả lời của người khác cho câu hỏi thứ hai: Có thể chúng tôi có được các ràng buộc từ ParameterInfo sử dụng GetGenericParameterConstraints(), nhưng nó không hoạt động trong mọi trường hợp. Hãy xem xét một số phương pháp chung chung như sau:

public static void MyMethod<T,V>() where T : Dictionary<int, int> 
{ 
} 

Có một ràng buộc cho phương pháp này, nhưng phương pháp không có tham số (suy nghĩ về Enumerable.Cast). Những gì tôi sẽ nói là ràng buộc không phải là một phần của các tham số, mà là chính phương thức đó. Chúng tôi có thể nhận được các ràng buộc bằng cách:

method.GetGenericArguments()[0].BaseType //the constraint of T 
method.GetGenericArguments()[1].BaseType //that of V: Object 
Các vấn đề liên quan