いつもお世話になっています。
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) VBAのコードで Dim Obj As AccessObject でコンパイルエラーがでます。 「ユ 2 2022/07/01 06:57
- その他(プログラミング・Web制作) pythonで変数にオブジェクトを代入するにはどうしたらよいでしょうか 2 2023/08/20 20:36
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- C言語・C++・C# C言語について。 5 2023/06/27 18:37
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- 弁護士・行政書士・司法書士・社会保険労務士 行政書士試験の民法についての質問になります。 留置権についての質問になります。 ①不動産がAからBと 3 2023/05/09 20:09
- Java インスタンス ダウンキャストについて以下の解釈であっているか教えて欲しいです。 サブクラスをスーパー 1 2022/03/27 18:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
javascriptからjavaを呼び出したい
-
Labelコントロールに数字を代入...
-
【sendkeysメソッドが動かずに...
-
final修飾子を使っているのに、...
-
エクセルのマクロでプリンタを...
-
DataGridViewでセルクリックイ...
-
JSPで<SELECT>の中にDBから持っ...
-
エクセルVBAにおけるON TIMEメ...
-
ジェネリックスに関して
-
ヘルパーメソッドとはなんですか?
-
Refreshメソッドの使い方
-
Range クラスのAutoFitプロパテ...
-
エクセルVBAのInputBoxメソ...
-
VBAでSaveAs使用し、指定してい...
-
worksheets & rows メソッドは...
-
ListViewにて行追加
-
VBPをダブルクリックするとたま...
-
ODBCでMoveNextがうまく動作し...
-
drawStringで文字間隔の調整
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
final修飾子を使っているのに、...
-
JSPで<SELECT>の中にDBから持っ...
-
Labelコントロールに数字を代入...
-
エクセルVBAにおけるON TIMEメ...
-
javascriptからjavaを呼び出したい
-
DataGridViewでセルクリックイ...
-
VBPをダブルクリックするとたま...
-
onClickで関数呼出し後に、結果...
-
コマンドプロンプト実行後に画...
-
配列のメソッド
-
日本の教育って時間が無い中で...
-
Refreshメソッドの使い方
-
mainメソッドのthrows節で設定...
-
【sendkeysメソッドが動かずに...
-
C# 演算 最大値 最小値 表現の仕方
-
VBA コピーが出来ません…!
-
Application.Wait の参照設定
-
ウィンドウを最前面にできません
-
for文(拡張)内の変数(ローカ...
おすすめ情報