var type = typeof(T);
bool isList = type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>);
Nếu bạn không cần khớp chính xác cho Danh sách, bạn cũng có thể kiểm tra xem typeof(IList).IsAssignableFrom(typeof(T))
có nhiều bộ sưu tập giống như danh sách hay không.
Nếu bạn muốn hỗ trợ T là bằng IList<T2>
trực tiếp (vì vậy các loại tham số T là một giao diện), sau đó bạn cần phải kiểm tra cho rằng riêng (GetGenericTypeDefinition()
cũng có thể trở lại typeof(IList<>)
).
Nếu bạn muốn hỗ trợ mọi loại T kế thừa từ bất kỳ IList<>
, thì bạn phải sáng tạo hơn một chút. Bạn phải liệt kê tất cả các giao diện, kiểm tra xem chúng có chung chung không (như trên) và sau đó kiểm tra xem kiểu chung của giao diện là IList<>
hay không. Ngoài ra, do cuộc gọi GetInterfaces() trên Type chỉ trả về các giao diện cấp cao nhất, bạn cần điều hướng qua tất cả các giao diện được thực hiện bởi mỗi giao diện (đệ quy), để kiểm tra các giao diện đó. Xấu xí, tôi biết.
Nguồn
2011-08-12 20:47:32
Bạn đã thử so sánh nó với một loại đối tượng danh sách khác không? – krs1
Điều này sẽ thất bại nếu bạn vượt qua nó một ví dụ 'NotReallyAList'. –
* Chính xác * ý của bạn là gì khi bạn nói "danh sách"? Bạn có nghĩa là loại chính xác 'System.Collections.Generic.List'? Hoặc bạn có nghĩa là bất cứ điều gì với 0 hoặc nhiều mặt hàng? Hoặc bất kỳ loại bộ sưu tập nào có thể đọc cũng như được cập nhật? v.v. –
stakx