dポイントプレゼントキャンペーン実施中!

いつもお世話になっています。
C#の動的キャストに関する質問です。

C#のメソッドにobjectの引数を渡して動的にキャストする場合
void Hoge(object obj)
{
Type t = Type.GetType(obj);
objの型 obj2 = (objの型)Convert.ChangeType(obj, t); //(1)
.................................
}
のようにされています。

しかし多様性をもつobjcetを引数にする多くの場合は「objの型」は不定です。
逆に言えば「objの型」がわかっている場合はわざわざobjectを引数にする必要はないわけです。

そこで質問ですが、何とかType t から「objの型」を取得して(1)記法による動的キャストを行う方法はないでしょうか?

GetMethod, GetPropertyでメソッド,プロパティを取得し、Invoke, GetValue, SetValueすることは可能ですが、できればドット記法(.)が使える (1) のような動的キャストを行いたいと考えています。

よろしくお願いします。

A 回答 (2件)

そのままではT型のメソッドやプロパティを呼ぶことはできません。


Bar()やFugaはHogeに渡す型すべてに存在するのでしょうか?
もしするのでしたら最大公約数的なインターフェイスを作って、
それぞれの型に実装してあげると使えるようになります。
interface HogeBase
{
 void Bar();
 object Fuga{ get; set; }
}
void Hoge<T>(T obj) where T : HogeBase
{
 obj.Bar();
 member = obj.Fuga;
}

Bar()やFugaはHogeに渡す型すべてに存在するのでないのなら、
少々手間が増えますがそれでも↑の応用でいけます。

(2)は型情報が要らないのなら捨ててしまっていいと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。

> Bar()やFugaはHogeに渡す型すべてに存在するのでしょうか?
私の場合、多くの場合objはFormの派生クラスやcoltrolで、現状の処理はobj.GetType().Nameで処理を分岐しています。(if~else, switch)

> もしするのでしたら最大公約数的なインターフェイスを作って、
> それぞれの型に実装してあげると使えるようになります。

やはりこういう処理が必要になるのですね。
参考にさせていただきます。

お礼日時:2011/03/19 06:30

(1)記法から外れますが、総称型を使うのはいかがでしょうか?


C#3.0でしたら、型を決め打ちせずとも自動的に型推論してくれます。

void Hoge<T>(T obj)
{
 Type t = typeof(T);
}

この回答への補足

早速 興味ある方法をありがとうございます。
もう少し教えてください

このあと、objのメンバーにアクセスする方法を教えてください。
メソッド : obj.Bar() 、プロパティ: obj.Fuga
でよろしいですか?

void Hoge<T>(T obj)
{
 Type t = typeof(T); // (2)
}

(2)の Type t の使い方をよろしく ご教示お願いします。

補足日時:2011/03/18 20:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!