2009-06-05 12 views
1

うん、私はこの質問のタイトルを正しく付けているのか、それとも正しく質問しているのか分かりませんが、ここには行きます。ダイナミック型/ XMLをSystem.Typeに変換するXMLをデシリアライズする

私は、型を示す文字列/ varcharと共に、データベースに格納されたシリアル化されたオブジェクト(XML内)を持っています。

今私はこれをやっている:(私は、異なるタイプの有限数を持っているので)

Dim deserializer as XmlSerializer 
If datatable("type") = "widget1" then 
    deserializer = new XmlSerializer(GetType(Widget1)) 
elseif datatable("type") = "widget2" then 
    deserializer = new XmlSerializer(GetType(Widget2)) 
... 

私は

Dim deserializer as XmlSerializer 
deserializer = new XmlSerializer(MagicallyConvertToSystemDotType(datatable("type")) 

ような何かをしたいのですが、私は間違っアップ吠えアムここに木?

答えて

2

Type.GetTypeを使用してみましたか?これは文字列パラメータを受け取り、その名前の型を返します。シンプルな名前の「ウィジェット」などについての詳細情報をフルネームの行に追加する必要があります。しかし、あなたのサンプルからは同じネームスペースを持つべきだから、大きな障害にならないはずです。

0

したい場合は、他のオプションは、実際のキーワードの種類は、で動作するように、そしてない変数の型のようなものを使用している(私はC#を使用してVBの変換を行うにはあまりにも疲れてごめんなさい):

method in XmlSerializer like Deserialize(typestring, object); 
method in XmlSerializer like Deserialize<T>(object); 


public void Deserialize(string typestring, object obj) 
{ 
    MethodInfo deserialize = typeof(XmlSerializer) 
     .GetMethod("Deserialize", BindingFlags.Instance | BindingFlags.Public) 
     .MakeGenericMethod(new Type[] { Type.GetType(typestring) }); 
    deserialize.Invoke(this, new[] { obj }); 
} 
を(:私はVB.Netではあまり機能していないので、私はすべてが構文的に正しいがあると思います注):具体的に
0

は、私はあなたがここにこのコードを探しているのだと思い

VB.Net:

// Get the type of object being deserialized. 
Dim t as Type = Type.GetType(typeNameString); 
// Make a new instance of the object. 
Dim o as Object = Activator.CreateInstance(t); 

C#:

// Get the type of object being deserialized. 
Type t = Type.GetType(typeNameString); 
// Make a new instance of the object. 
object o = Activator.CreateInstance(t); 

編集(2009年10月26日、夜03時10 GMT-0600):Type.GetType(文字列typeNameString)メソッドは常に単純に自分の完全修飾名と種類を認識しません。次のようにそれは、確かにあなたの最善の利益になると、自分のパラメータ文字列にすることができますようにできるだけ多くの情報が含まれます:

VB.Net/C#:

typeNameString = objectSerialized.GetType().Namespace + ", " + objectSerialized.GetType().Name + ", " + objectSerialized.GetType().Assembly.FullName 
少ない

は、具体的には、私はちょうど持っていました同じ問題があり、多くの研究の末、最終的には、すべてほとんどの処理のための素晴らしい解決策を思いついた。オブジェクトのシリアライズとデシリアライズが可能なクラスにソースコード全体を投稿しましたReflectionを使用しているジェネリックまたはアレイを含まない自由に持ち、自分のものとして使用してください。 誰かがジェネリックと配列の処理を追加することを決めたら、更新されたコピーを送って、私のブログに戻すことができるようにしてください(そしてあなたは名誉ある言及を得るでしょう - )...)。これはすべてを再帰的にシリアライズし、列挙型のためにいくつかの特別なコーディングもあります。それはあなたがで探しているすべてのものをカバーする場合

を見て、参照してください。

http://maxaffinity.blogspot.com/2009/10/serialize-objects-manually.html

〜のmd5sum〜

編集(2009年10月27日午後2時38分GMT-0600):私のブログから利用できるクラスについての誤った情報を修正しました。