C# で動的にキャストすることはできるのでしょうか?


やりたいことは、たとえば、A から Z という名前をもったクラスがあるとして、あるオブジェクト object に対して、

(A)object
(B)object
:
(Z)object

とそれぞれのクラスでキャストが可能とします。

これを順次キャストしていくのに、

string [] classes = { "A", ... "Z"}

のようなクラス名を持った配列を用意し、これを

for (int i=0; i <classes.length; i++)
{
classes[i] で object をキャストする
}

のようにぐるぐる回したいのですが、クラス名を変数としてキャストする方法、つまり上記の文章部分を実現したいのですが、可能なのでしょうか?

回答の条件
  • 1人2回まで
  • 登録:2008/01/22 01:38:43
  • 終了:2008/01/27 21:28:31

ベストアンサー

id:ke-k No.1

ke-k回答回数1ベストアンサー獲得回数12008/01/25 15:00:49

ポイント100pt

キャストした後に何がしたいか、により答えが変わってくるかとは思いますが…

単にキャスト演算子を呼び出したい、もしくはダックタイピングのようなことでしたら可能だと思います。

Type t = Type.GetType(classes[i]);

で、文字列に対応するSystem.Typeオブジェクトが得られます。

与える文字列は名前空間を含むクラスのフルネームです。

(例えば"int"などではなく"System.Int32"でなくてはだめです)


これを使えば、

Convert.ChangeType(object, t);

でキャスト演算子を呼び出せるはずです。ただし、戻り値の型はSystem.Objectです。

http://www.thescripts.com/forum/thread436109.html


キャストそのものよりもある名前のメソッドを呼び出したいのであれば、

MethodInfo mi = t.GetMethod("Foo");

でメソッドを取得し、

Object[] paramlist = { param1, param2, ... }; // メソッドの引数の配列
mi.Invoke(object, paramlist); 

で呼び出せます。

プロパティの場合は GetProperty して、 GetValue, SetValue です。

http://www.atmarkit.co.jp/fdotnet/dotnettips/359callbyname/callb...

id:jishiha

意図を組んでくださり、的確な回答いただきありがとうございます。

プロパティに動的にアクセスするのが本来の目的で、GetProperty を使うことで解決しました。

2008/01/27 21:27:34

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません