いつもお世話になっています。
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) のような動的キャストを行いたいと考えています。
よろしくお願いします。
No.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)は型情報が要らないのなら捨ててしまっていいと思います。
ありがとうございます。
> Bar()やFugaはHogeに渡す型すべてに存在するのでしょうか?
私の場合、多くの場合objはFormの派生クラスやcoltrolで、現状の処理はobj.GetType().Nameで処理を分岐しています。(if~else, switch)
> もしするのでしたら最大公約数的なインターフェイスを作って、
> それぞれの型に実装してあげると使えるようになります。
やはりこういう処理が必要になるのですね。
参考にさせていただきます。
No.1
- 回答日時:
(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 の使い方をよろしく ご教示お願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
DataGridViewでセルクリックイ...
-
VBA コピーが出来ません…!
-
staticメソッドの長所短所
-
エクセルVBAにおけるON TIMEメ...
-
JAVA初心者です。JAVAで音を鳴...
-
Refreshメソッドの使い方
-
VB.netで、シリアル通信のタイ...
-
サーブレット GETからPOST送信
-
InetAddress#getHostNameについ...
-
final修飾子を使っているのに、...
-
シンボルを解決できません。 ...
-
ListViewにて行追加
-
Range クラスのAutoFitプロパテ...
-
mainメソッドのthrows節で設定...
-
Javaの戻り値のコード
-
動的カレンダーの作成手順・方法
-
eclipse-Tomcatでのデバッグに...
-
ヘルパーメソッドとはなんですか?
-
Excel VBA シェイプの原型のサ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
コマンドプロンプト実行後に画...
-
DataGridViewでセルクリックイ...
-
Labelコントロールに数字を代入...
-
エクセルVBAにおけるON TIMEメ...
-
javascriptからjavaを呼び出したい
-
mainメソッドのthrows節で設定...
-
Refreshメソッドの使い方
-
配列のメソッド
-
final修飾子を使っているのに、...
-
VBPをダブルクリックするとたま...
-
ウィンドウを最前面にできません
-
JSPで<SELECT>の中にDBから持っ...
-
【sendkeysメソッドが動かずに...
-
Excel VBA でExcelを終了したい...
-
VB.netで、シリアル通信のタイ...
-
Application.Wait の参照設定
-
Excel VBA シェイプの原型のサ...
-
onClickで関数呼出し後に、結果...
-
drawStringで文字間隔の調整
おすすめ情報