2012-01-10 12 views
5

多次元配列の最も内側の要素の型を取得するにはどうすればよいですか?C#多次元配列の型を取得

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" 

配列の次元数(Rank)に関係なく、最も内側の要素型を取得したいと考えています。

+0

var qq = new int [2,3] {{1,2,3}、{1,2,4}}の行に沿ったものです。 var bounds = Enumerable.Range(0、qq.Rank).Select(r => qq.GetLowerBound(r))。ToArray(); var fst = qq.GetValue(bounds); しかし、そのバギーと複雑な。 –

答えて

13

使用GetElementType()

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

+1 [HasElementType](http://msdn.microsoft.com/en-us/library/system.type.haselementtype.aspx)から最初に確認することもできます。 –

+0

Sweet。私は 'Type'型が何かを使うかもしれないと思っていましたが、それを見つけることができませんでした。 –

2

あなたが必要なものの箱のうち方法の欠如があります見つけたとき、あなたは常に独自の拡張メソッドを書くことができます。

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

(コードでnodeと命名)指定されたタイプがが要素タイプを有するタイプであった場合は、(私はエッセンスタイプと呼ぶ)最も内側の要素タイプを返します。それ以外の場合はnullです。


編集:

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

あなたがデリゲートを作成したり、反射を経由して、それを使用することができます:

Typeは内部メソッドが同様のことをしてい

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

注:GetRootElementType要素型がない場合は、指定された型自体を返します。

+0

+1すると動作します。しかし、私はそのようなループを(不必要に)読むのが難しいと思います。 LHSのnull比較のようなC++の場合と同じです。 –