- PR -

配列の型の取得について

1
投稿者投稿内容
kekyo
会議室デビュー日: 2002/12/12
投稿数: 13
投稿日時: 2003-04-15 12:37
こんにちは、hogeraです。
C#で配列の型を取得するとき、以下のように書きます。

object[] hoge = new string[5];
Type t = hoge.GetType();

ここで得られるのは、文字通り object[] ですが、
配列のベースとなっている型(この場合object)のTypeクラスを
取得するにはどうすれば良いでしょうか?

以下のようにすると実行時の型については配列毎に取得できます。

Type[] ts = Type.GetTypeArray(hoge);

しかしこの場合、実行時の型なのでstringのTypeクラスが返ってきます。
さらに悪いことに、nullが入っている場合、NullReferenceException
が発生します。

よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-04-15 14:27
こんにちは。
引用:

hogeraさんの書き込み (2003-04-15 12:37) より:

object[] hoge = new string[5];
Type t = hoge.GetType();

ここで得られるのは、文字通り object[] ですが、
配列のベースとなっている型(この場合object)のTypeクラスを
取得するにはどうすれば良いでしょうか?


 そうですか?私のところではSystem.String[]が返ってくるのですが・・・
object[] hoge = new string[5];
this.Text = hoge.GetType().ToString();

 MSDN Magazine 日本語版28号の One Point Lesson より。
〜〜〜引用
質問:MSDN Magazie 日本語版24号のこのページで、基底クラスのコンストラクタに派生クラスの名前を渡す方法が解説されていました。私はC#でこれと同じ問題を・・・(略)

回答:私のソリューションをC#に移植する必要はありません。C#にはこの問題が存在しないからです。C#ではオブジェクトは未来永劫にわたってずっとそのオブジェクトのままだからです・・・(略)
〜〜〜終わり
kekyo
会議室デビュー日: 2002/12/12
投稿数: 13
投稿日時: 2003-04-15 15:07
こんにちは、返事ありがとうございます。
すいません、間違えていました。
確かに GetType() は実行時インスタンスの型を返します。
以下に書き直します。

public class A
{
public A()
{
}
}
public class B : A
{
public B()
{
}
}
//...
A[] a = new A[2];
a[0] = new B();
a[1] = new B();
object hoge = a;
Type t1 = hoge.GetType();

このコードで t1は A[] になるかと思います。
ここでhogeからAのTypeクラスを取得したいのです。

Type t2 = ((object[])hoge)[0].GetType();

とした場合、BのTypeクラスになります。
また、そもそも配列にインスタンスが設定されていないと
GetType()出来ません。

わかりにくくてすいません。よろしくお願いします。
kekyo
会議室デビュー日: 2002/12/12
投稿数: 13
投稿日時: 2003-04-15 15:24
hogeraです。自己レスです。

Type クラスに GetElementType() メソッドがあり、これを使用すると
目的を達成できることがわかりました。

Type t3 = hoge.GetType().GetElementType();

で、t3はAになりました。
お騒がせしました。

#MSDNライブラリの説明はわかりにくいです
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-04-15 16:24
>#MSDNライブラリの説明はわかりにくいです
同感
1

スキルアップ/キャリアアップ(JOB@IT)