
いつもお世話になっています。
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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
VBAでSaveAs使用し、指定してい...
-
0歳児の指しゃぶりに関して
-
実行時引数をrun()メソッドに渡...
-
仕様に沿って3つの整数の最大値...
-
eclipse-Tomcatでのデバッグに...
-
worksheets & rows メソッドは...
-
Lightboxのグループをループさ...
-
WSH(VBScript)で共有フォルダを...
-
VBAでコピーコマンドを実行する...
-
C#でフォームのオブジェクト名...
-
インスタンス参照でアクセスで...
-
パワーポイントのVBAでテキスト...
-
「タイプ初期化子が例外をスロ...
-
僕の出身中学校は200人同級生が...
-
【JAVA】与えられた金額を貨幣...
-
変数名の付け方
-
Accessの連結・非連結オブジェ...
-
ResultSet での問題
-
BLOB型の画像データを表示したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
配列のメソッド
-
mainメソッドのthrows節で設定...
-
final修飾子を使っているのに、...
-
0歳児の指しゃぶりに関して
-
javascriptからjavaを呼び出したい
-
DataGridViewでセルクリックイ...
-
JSPで<SELECT>の中にDBから持っ...
-
boolean型のフィールドとゲッタ...
-
Labelコントロールに数字を代入...
-
ウィンドウを最前面にできません
-
処理内容がほぼ同じメソッドの...
-
eclipse-Tomcatでのデバッグに...
-
CALLされていないメソッドを見...
-
FEM解析の読み方は?
-
エクセルVBAにおけるON TIMEメ...
-
Application.Wait の参照設定
-
コマンドプロンプト実行後に画...
-
VBA コピーが出来ません…!
-
drawStringで文字間隔の調整
おすすめ情報