2013-06-06 33 views
29

Làm thế nào tôi có thể xác định xem Type là của Dictionary<,>Xác định xem loại là điển

Hiện nay điều duy nhất mà làm việc đối với tôi là nếu tôi thực sự biết các đối số.

Ví dụ:

var dict = new Dictionary<string, object>(); 
var isDict = dict.GetType() == typeof(Dictionary<string, object>; // This Works 
var isDict = dict.GetType() == typeof(Dictionary<,>; // This does not work 

Nhưng điển sẽ không phải luôn luôn <string, object> vậy làm thế nào tôi có thể kiểm tra xem nó là một cuốn từ điển mà không biết các đối số và không cần phải kiểm tra tên (kể từ khi chúng tôi cũng có các lớp học khác có chứa các từ Dictionary

+7

'từ điển' <,> đối tượng thực hiện 'IDictionary' có thể 'typeof (IDictionary)'. –

+0

có thể có nguyên thủy không? Tôi không quen thuộc với C#, nhưng không phải mọi lớp đều là một System.Object hậu duệ? – sschrass

Trả lời

54
Type t = dict.GetType(); 
bool isDict = t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Dictionary<,>); 

sau đó bạn có thể nhận được chìa khóa và giá trị loại:.

Type keyType = t.GetGenericArguments()[0]; 
Type valueType = t.GetGenericArguments()[1]; 
+0

GetGenericTypeDefinitions ném ngoại lệ loại "System.InvalidOperationException". Phải là bởi vì tôi đang thử nghiệm nó chống lại một loại không chung chung. Ngu ngốc! –

+0

@TheunArbeider - Điều đó chỉ xảy ra nếu loại không phải là chung chung, bạn có bao gồm điều kiện 'IsGenericType' không? – Lee

+0

Yup, quên isgenerictype :) –

3

Bạn có thể sử dụng IsAssignableFrom để kiểm tra xem loại có thực hiện IDictionary hay không.

var dict = new Dictionary<string, object>(); 

var isDict = typeof(IDictionary).IsAssignableFrom(dict.GetType()); 

Console.WriteLine(isDict); //prints true 

Mã này sẽ in sai cho tất cả các loại, không triển khai giao diện IDictionary.

5

Có một cách rất đơn giản để làm điều này và bạn đã rất gần đó.

Hãy thử điều này:

var dict = new Dictionary<string, object>(); 
var isDict = (dict.GetType().GetGenericTypeDefinition() == typeof(Dictionary<,>)) 
1

thế nào về

Dictionary<string, object> d = new Dictionary<string, object>(); 
Dictionary<int, string> d2 = new Dictionary<int, string>(); 
List<string> d3 = new List<string>(); 

Console.WriteLine(d is System.Collections.IDictionary); 
Console.WriteLine(d2 is System.Collections.IDictionary); 
Console.WriteLine(d3 is System.Collections.IDictionary); 

như tất cả các loại từ điển chung kế thừa từ giao diện IDictionary, bạn chỉ có thể kiểm tra xem

+0

Điều này có vẻ độc đáo nhưng không hoạt động: "Sử dụng loại chung 'System.Collections.Generic.IDictionary ' yêu cầu 2 loại đối số" –

+0

@BorisZinchenko chỉ cần sao chép dán vào thử nghiệm và chạy nó, không có lỗi. Và thông báo lỗi bạn đã nói, có vẻ như bạn đang thiếu một Loại trong định nghĩa từ điển. Như trong 'Dictionary 'vs' Dictionary ' – Igarioshka

+0

bạn có thể thấy mã của bạn và lỗi ở đây: https://dotnetfiddle.net/JJpHIi –

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