C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: Objectから動的に型取得してキャスト処理


(過去ログ 41 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■21604 / inTopicNo.1)  Objectから動的に型取得してキャスト処理
  
□投稿者/ 鶏唐揚 (228回)-(2008/07/05(Sat) 13:40:45)

分類:[VB.NET/VB2005] 

2008/07/05(Sat) 13:44:21 編集(投稿者)
[OS]XP SP3/Vista SP1
[VB]2005 SP1

お世話になっております。
今回はXMLシリアライズをメソッドで行う際の、DirectCastの第2引数のTypeを動的指定したい
というものです。

Public Function GetXMLData(ByVal XMLFile As String, ByRef DataCls As Object) As Boolean
    Dim serializer As XmlSerializer
    Dim fs As FileStream

    Try
        If File.Exists(XMLFile) Then
            serializer = New XmlSerializer(DataCls.GetType)
            fs = New FileStream(XMLFile, FileMode.Open)

            'XMLファイルから読み込み、逆シリアル化する
            DataCls = DirectCast(serializer.Deserialize(fs), ここを動的にしたい)

            fs.Close()
        End If
...略
End Function

しかし、定義済みの型を指定するのが通常で、実行時どころかコンパイルエラーなので
無理な話だと考えてます(その他メソッドにType型引数を追加し、そのTypeを指定したりもしたけど無理)

最悪はVBお得意の暗黙型変換にて解決できるのですが、警告にも出てきて気持ち悪いので
できれば明示的型変換を行いたいと思います。
DirectCastではなくても、Object変数から(または型名を指す文字列から)型取得&型指定してキャストする方法があれば
ご教示ください。よろしくお願いします。

引用返信 編集キー/
■21605 / inTopicNo.2)  Re[1]: Objectから動的に型取得してキャスト処理
□投稿者/ なちゃ (137回)-(2008/07/05(Sat) 15:00:19)
基本的にはジェネリックにするしかないでしょう。

引用返信 編集キー/
■21606 / inTopicNo.3)  Re[1]: Objectから動的に型取得してキャスト処理
□投稿者/ やじゅ (477回)-(2008/07/05(Sat) 15:19:22)
やじゅ さんの Web サイト
2008/07/05(Sat) 15:30:03 編集(投稿者)

No21604 (鶏唐揚 さん) に返信
> 今回はXMLシリアライズをメソッドで行う際の、DirectCastの第2引数のTypeを動的指定したい
> 最悪はVBお得意の暗黙型変換にて解決できるのですが、警告にも出てきて気持ち悪いので
> できれば明示的型変換を行いたいと思います。
> DirectCastではなくても、Object変数から(または型名を指す文字列から)型取得&型指定してキャストする方法があれば
> ご教示ください。よろしくお願いします。

違うかも知れないけど・・・ 未確認だし
クラスを定義したdllファイル(例 Hoge.dll)を作成して

Dim myType As Type = Nothing
Dim assemblyObject As System.Reflection.[Assembly] = Nothing
Dim clsName As String

assemblyObject = System.Reflection.[Assembly].LoadFrom("Hoge.dll")
clsName = "xxxxx"
myType = assemblyObject.GetType("Hoge."& clsName)

'XMLファイルから読み込み、逆シリアル化する
DataCls = DirectCast(serializer.Deserialize(fs), myType)
引用返信 編集キー/
■21613 / inTopicNo.4)  Re[2]: Objectから動的に型取得してキャスト処理
□投稿者/ 鶏唐揚 (229回)-(2008/07/06(Sun) 00:12:36)
返信ありがとうぎざいます。

No21605 (なちゃ さん) に返信
> 基本的にはジェネリックにするしかないでしょう。
>
ジェネリックについてあまり詳しくなかったので調べてみます。

No21606 (やじゅ さん) に返信
>違うかも知れないけど・・・ 未確認だし
>クラスを定義したdllファイル(例 Hoge.dll)を作成して
あまりDLLファイル等増やしたくないのですが、
実現できるならこちらも後で試してみます。

引用返信 編集キー/
■21617 / inTopicNo.5)  Re[3]: Objectから動的に型取得してキャスト処理
□投稿者/ やじゅ (478回)-(2008/07/06(Sun) 01:15:19)
やじゅ さんの Web サイト
No21613 (鶏唐揚 さん) に返信
> あまりDLLファイル等増やしたくないのですが、
> 実現できるならこちらも後で試してみます。
>

自分自身ならDLLファイルを増やさなくていけるかも
assemblyObject = System.Reflection.[Assembly].GetExecutingAssembly()
引用返信 編集キー/
■21624 / inTopicNo.6)  Re[4]: Objectから動的に型取得してキャスト処理
□投稿者/ なちゃ (138回)-(2008/07/06(Sun) 15:16:22)
Public Function GetXMLData(Of T)(ByVal XMLFile As String, ByRef DataCls As T) As Boolean

serializer = New XmlSerializer(GetType(T))

DataCls = DirectCast(serializer.Deserialize(fs), T)

な感じで、呼び出す側の引数の型に応じて自動的に使い分けられます。

Dim target As DataType
If GetXMLData("hoge", target) Then

みたいな(あらかじめtargetにインスタンスを作成しておく必要もありません)。

文字列表現された型、Typeなどを扱うやり方では基本的にできません。
※キャストではなくて単に型の互換性のチェックとかだけならまあやりようはありますが。
引用返信 編集キー/
■21632 / inTopicNo.7)  Re[5]: Objectから動的に型取得してキャスト処理
□投稿者/ 鶏唐揚 (230回)-(2008/07/06(Sun) 20:34:54)
No21624 (なちゃ さん) に返信
ジェネリックについて難しく考えてましたが、実際に使うにはそんな
簡単な話だったのですか…ありがとうございます。

とりあえず暗黙型変換よりは安全そう&現状のコードに合ってるので
この方法でやってみたいと思いますが、デメリットがないか調べて見ます。

今回は解決にさせていただきます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -