2012-01-10 41 views
5

Làm cách nào để lấy loại phần tử bên trong nhất của một mảng đa chiều?C# Lấy loại mảng đa chiều

var qq = new int[2,3]{{1,2,3}, {1,2,4}}; 
var t = qq.GetType().ToString();//is "System.Int32[,]" 
var t2 = ??; // should be "System.Int32" 

Tôi muốn nhận được loại phần tử trong cùng bất kể số thứ nguyên của mảng (Xếp hạng).

+0

Điều gì đó dọc theo các dòng của var qq = new int [2,3] {{1, 2, 3}, {1, 2, 4}}; var bounds = Enumerable.Range (0, qq.Rank) .Chọn (r => qq.GetLowerBound (r)). ToArray(); var fst = qq.GetValue (giới hạn); nhưng lỗi của nó và phức tạp. –

Trả lời

13

Sử dụng GetElementType():

var t2 = qq.GetType().GetElementType().ToString(); 
+4

+1 bạn cũng có thể muốn kiểm tra với [HasElementType] (http://msdn.microsoft.com/en-us/library/system.type.haselementtype.aspx) trước tiên –

+0

Ngọt ngào. Tôi nghĩ loại 'Loại' có thể có thứ gì đó có thể sử dụng được, nhưng không thể tìm thấy nó. –

2

Khi bạn tìm thấy ở đó là một thiếu phương pháp ra khỏi hộp về những gì bạn cần, bạn luôn có thể viết phương pháp khuyến nông của riêng bạn.

public static Type GetEssenceType(this Type node) { 
    for(Type head=node, next; ; node=next) 
     if(null==(next=node.GetElementType())) 
      return node!=head?node:null; 
} 

Nó trả về nội nhất yếu tố loại (mà tôi gọi là loại chất) nếu loại nhất định (tên node trong code) là một loại mà có yếu tố loại; nếu không, null.


Edit:

Type có một phương pháp nội bộ không điều tương tự:

internal virtual Type GetRootElementType() 
{ 
    Type elementType = this; 
    while (elementType.HasElementType) 
    { 
     elementType = elementType.GetElementType(); 
    } 
    return elementType; 
} 

Bạn có thể tạo ra một đại biểu hoặc sử dụng nó thông qua phản ánh:

var bindingAttr=BindingFlags.Instance|BindingFlags.NonPublic; 
var method=typeof(Type).GetMethod("GetRootElementType", bindingAttr); 
var rootElementType=(Type)method.Invoke(givenType, null); 

Lưu ý rằng GetRootElementType trả về kiểu đã cho nếu nó không có kiểu phần tử.

+0

+1 'vì nó hoạt động. Nhưng tôi thấy như vậy cho các vòng (không cần thiết) khó đọc. Tương tự cho C++ - giống như so sánh null LHS. –