VB.netで、
動的な型変換を行いたいと思っています。
イメージ的には、
CType(hogehoge,String)やCType(hogehoge,Integer)
CType(hogehoge,MyClassHogehoge)
ではなく、
CType(hogehoge,"String"),CType(hogehoge,"Integer")
CType(hogehoge,"MyClassHogehoge")
というように、
その場の変数で決まる型変換です。
Dim a as MyClassA
Dim b as Object
とあって
CType(b,a)というような変換をしたいのです。
(が、CTypeやDirectCastの第二引数は、
定義された型名しか受け付け無いようです。)
-----
実際には、
mytype.InvokeMember("変数名", BindingFlags.SetProperty Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance, Nothing, "インスタンス", New [Object]() {"設定値"})
という処理をやる上で、
"設定値"が文字列(String)である場合、
"変数名"で、動的にアサインされた変数の型(たとえばMyClass)に型変換しないと、
値が設定できないためです。
(CType("設定値","インスタンス"."変数名")というようなこと必要となってくるはずです、、、)
-----
上記手順が、可能なのかどうか、
まったくのナンセンスなのかどうかも
わかっていないので、
一言でもいただけるとたすかります。。。
どうぞよろしくおねがいいたします。
No.4ベストアンサー
- 回答日時:
関数[init]の第二引数[pStr2]がStringなので、それようの受けを作る必要があります。
Stringでの受けができる状態にしておかないと、クラスに用意したメソッドが見つからなくて落ちます。
ただしObject型は、受けが発生してから領域を確保する変数なので、それは考慮する必要はありません。
以下のようにしたら可能かと思います。
Public Class MyClassA
Private _A As Integer
Private _B As Double
Private _C As Decimal
Private _D As String
Private _E As Object
Public Sub A(ByVal Value As Integer)
_A = Value
End Sub
Public Sub B(ByVal Value As Double)
_B = Value
End Sub
Public Sub C(ByVal Value As Decimal)
_C = Value
End Sub
Public Sub D(ByVal Value As String)
_D = Value
End Sub
Public Sub E(ByVal Value As Object)
_E = Value
End Sub
Public Sub A(ByVal Value As String)
Call A(CInt(Value))
End Sub
Public Sub B(ByVal Value As String)
Call B(CDbl(Value))
End Sub
Public Sub C(ByVal Value As String)
Call C(CDec(Value))
End Sub
End Class
No.5
- 回答日時:
> Select文で型名ごとに分岐して
> その都度Ctypeする方法で代用しようかと思います。
> '/--- 呼び出しは、文字列型1と文字列型2の組み合わせ。(外部から、テキストで与えられる)
> init("A", "1")
init内で文字列"1"をint型の1に変換するのですよね。
キャスト(Ctype)では出来ないはずですが...
http://www.atmarkit.co.jp/fdotnet/dotnettips/001 …
> 型の種類が(自前のクラスも含め)
文字列を自前クラスへの型変換なんてできるのでしょうか?
# XMLシリアライス/デシリアライズならありえますが
この回答への補足
CTypeで無理なものは、
ソースをごりごり書くつもりでした。
>文字列を自前クラスへの型変換なんてできるのでしょうか?
も、単純にキャストが不可能なものは、
自前クラスをコンストラクトする、ことを考えてました。
舌足らずですみませんでした。
No.3
- 回答日時:
接続詞を間違ったために、私の発言したい事とニュアンスが全く異なる文章となったので、訂正いたします。
最後の一文
× 動的な型変換ではなく、動的な関数を実行する方向では、代用できませんか?
○ 動的な型変換ではなく、動的に関数を実行する方向では、代用できませんか?
何度も回答ありがとうございます。
Invokeのように、有用な機能があったので、
型の変換も、きっときれいにできるはずだ、と
思ってしまっていました。
複数の引数の型を用意する、よりもっと
どんくさいかもしれませんが、
Select文で型名ごとに分岐して
その都度Ctypeする方法で代用しようかと思います。
型の種類が(自前のクラスも含め)
膨大なので、躊躇していました。。。
考えあぐねていたところに、多くの示唆をいただきました。ありがとうございました。
-------------------------------
(一応、やりたかったことのソースを添付します。
最初に書くべきでした、、、すいません、、、)
Public Class MyClassA
Private _A As Integer
Private _B As Double
Private _C As Decimal
Private _D As String
Private _E As Object
Public Sub A(ByVal Value As Integer)
_A = Value
End Sub
Public Sub B(ByVal Value As Double)
_B = Value
End Sub
Public Sub C(ByVal Value As Decimal)
_C = Value
End Sub
Public Sub D(ByVal Value As String)
_D = Value
End Sub
Public Sub E(ByVal Value As Object)
_E = Value
End Sub
End Class
Public Class Sample
Sub init(ByVal pStr1 As String, ByVal pStr2 As String)
Dim ma As MyClassA = New MyClassA
Dim t As Type
t = ma.GetType
'↓OK ma.A(1)と同等
t.InvokeMember("A", BindingFlags.InvokeMethod, Nothing, ma, New [Object]() {1})
'↓NG
t.InvokeMember(pStr1, BindingFlags.InvokeMethod, Nothing, ma, New [Object]() {pStr2})
End Sub
<TestAttribute()> _
Sub main()
'/--- 呼び出しは、文字列型1と文字列型2の組み合わせ。(外部から、テキストで与えられる)
init("A", "1")
init("B", "1.5")
init("C", "1.15")
init("D", "aaa")
init("E", "bbb")
End Sub
End Class
No.2
- 回答日時:
New [Object]() {"設定値"})
で落ちているのですよね・・・
受けのクラスが、どのようになっているのかがわからないので、
>型を変換しないと、例外がThrowされてしまうので、
と言われてもどうしようもないのですが。。。
全てのパターンを網羅するような、様々の型の受けることができるクラスを用意することにより対応した方がいいのでは?
たとえば
http://dobon.net/vb/dotnet/programing/typeinvoke …
でクラスの中に「StaticMethod」が二つありますよね?
引数が2個/3個のInteger型
となっていますが、同引数で文字型やらいりいろな型のパターンを切っておけば、その都度適した型のメソッドが実行されます。
動的な型変換ではなく、動的な関数を実行する方向では、代用できませんか?
No.1
- 回答日時:
思いっきりヘルプを引用
http://www.microsoft.com/japan/msdn/library/defa …
で、第二引数[typename]の解説で
>Dim ステートメントの As 句で有効な任意の式
とあります。
だから、コンパイル時に確定される型しかできません。
CTypeだけのピックアップされた質問なので、なぜ型を動的にしなければならないのかがわかりませんが、、、
どうしてもそうしなければいけないのであれば、それを解消する別手段を考えた方が、スムーズに行くと思いますよ。
この回答への補足
回答ありがとうございます。
> CTypeだけのピックアップ
CTypeにこだわっているわけではなく、
動的に型を変換したい、という意味で
「比ゆ的」にCTypeを説明につかわせてもらいました。
(わかりにくくて、すみません)
型を動的に変換したい理由は、
質問文中の
> mytype.InvokeMember("変数名", ~
のところで、"変数名"の型にそろえるように、毎回
> New [Object]() {"設定値"})
の型を変換しないと、例外がThrowされてしまうので、
「型を動的に変換したい」
と思っています。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
大人になっても苦手な食べ物、ありますか?
大人になっても、我慢してもどうしても食べれないほど苦手なものってありますよね。 あなたにとっての今でもどうしても苦手なものはなんですか?
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
許せない心理テスト
私は「あなたの目の前にケーキがあります。ろうそくは何本刺さっていますか」と言われ「12本」と答えたら「ろうそくの数はあなたが好きな人の数です」と言われ浮気者扱いされたことをいまだに根に持っています。
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
vb.netで画面のコントロールId名を変数で動的に制御し処理する方法
Visual Basic(VBA)
-
変数名の付け方
Java
-
VB.NETで小数点以下の桁数を取得したい
その他(ソフトウェア)
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
共通モジュールでDBへの接続と...
-
[VBA] Classから他のClassを呼...
-
パソコンへの「Dropbox...
-
ユーザーフォームのテキストボ...
-
worksheetFunctionクラスのVloo...
-
VBA シートのボタン名を変更し...
-
VBA(エクセル)で自動的にボタン...
-
実行時エラー 438になった時の...
-
カメラスクロールするのを動画...
-
アクセスのUserFormにはInitial...
-
「Columns("A:C")」の列文字を...
-
C#で角が丸いテキストボックス
-
リストボックス 何も洗濯され...
-
ExcelVBAでListViewが使用できない
-
Excelにて、ユーザーフォームで...
-
VBAで既に開いている別アプリケ...
-
今日スマホでネットをしていた...
-
ユーザーフォーム上に現在日時...
-
ACCESSのフォーム、開くんです...
-
EXCEL VBAでテンキー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
共通モジュールでDBへの接続と...
-
[VBA] Classから他のClassを呼...
-
他のモジュールのプロシージャ...
-
Excel vbaで複数のテキストボッ...
-
VB.netで、動的な型変換を行い...
-
WPFでCanvas の子要素にアクセ...
-
VB6で外部から静的アクセスが可...
-
VBA モジュールレベル・パブリ...
-
シーケンス図について。
-
用語の意味の違いを教えてくだ...
-
バウンドプロパティとは?
-
リフレクションはどういったも...
-
コンポーネント指向って、どの...
-
現在使用しているJAVAファイル...
-
ジェネリクスについて
-
【JSF】バッキングビーンから別...
-
hibernate criteria
-
VB.NETにて文字列で指定した関...
-
VBAで、Functionを、クラスモジュール...
-
ポリモーフィズムについて考え...
おすすめ情報