7

ジェネリックXMLからオブジェクトへのコンバーターを作成しようとしています。言い換えれば、以下は私のXMLです

<setting>
   <name>testing</name> 
   <type>System.String</type>
   <defaultObj>TTTT</defaultObj>
</setting>

typeフィールドは、ロードし直したオブジェクトのタイプを保持します。これは、私が固定したオブジェクト構造にすぎません。それでも、変換で問題が発生します。

System.String

実際の型変数に。したがって、たとえば、変換するために、次のコードがあります。

foreach (XNode node in document.Element(root).Nodes())
{
   T variable = new T(); //where T : new()

   foreach (FieldInfo field in fields)
   {
      field.SetValue(variable, Convert.ChangeType(((XElement)node).Element(field.Name).Value, field.FieldType));
   }

   retainedList.Add(variable);
}

これは、一般的な方法でオブジェクトを取得します。Typeフィールドに出くわすまで、アルゴリズムは完全に機能します。私は得る:

Invalid cast from 'System.String' to 'System.Type'.

ランタイムエラー。私が知る限り、タイプ識別子(文字列)を直接タイプに変換する際に問題が発生しています。少なくとも、物事を一般的でクリーンに保つことに関しては、この問題を回避する方法がわかりません。何か案は?問題が少し曖昧な場合は申し訳ありませんが、よくわからない場合はさらに明確にしようと思います。どんな助けでも大歓迎です!

4

3 に答える 3

10

System.String文字列をタイプに変換する必要がありますSystem.String

あなたはそれをすることができますType.GetType(string typeName);

たとえば、type以下の変数のTypeオブジェクトはSystem.String。です。

var type = Type.GetType("System.String");

その後、使用しているオーバーロードでそれを使用TypeできConvert.ChangeTypeます。

Convert.ChangeType(fieldValue, type);
于 2012-10-29T16:46:20.330 に答える
5

文字列として指定されたタイプをインスタンスにマップするためのさまざまなオーバーロードがあるType.GetTypeを見てください。Type

于 2012-10-29T16:46:32.543 に答える
-7

私の意見では、ここで言う必要があるのは、シリアライザーとデシリアライザーに取り組む前に、C#でのプログラミングにかなり精通している必要があるということです。上で示唆したように、この特定の障害はType.GetTypeメソッドを使用して解決できますが、System.Xml.Serialization名前空間の方向を示します。この名前空間では、このようなことがすでに解決されており、簡単に使用できるように準備されています。

于 2012-10-29T16:55:01.577 に答える