2009-09-23 18 views
7

私はこのXML文書string型のオブジェクトをT型のオブジェクトに動的にキャストする方法

<AdditionalParameters> 
<PublishToPdf Type ="System.Boolean">False</PublishToPdf> 
</AdditionalParameters> 

私のコードで、私は<PublishToPdf>ノードを含む引数の配列を構築しようとしています。

object test = (object) ((typeof(publishNode.Attributes["Type"].value)) publishNode.InnerText); 

これはもちろんコンパイル時に壊れます。 XMLファイルで指定された型の実行時定義オブジェクトにpublishNode.InnerText('false')をキャストし、それをオブジェクトに保存する方法を理解できません(型を節約します)。

答えて

19

あなたはConvert.ChangeTypeを使用することができます。

object value = Convert.ChangeType(stringValue, destinationType); 
+0

ありがとう、それは正常に働いた。 – LolaRun

+0

はい、destinationTypeを取得するには、 を使用してください。var destinationType = Type.Parse(publishNode.Attributes ["Type"]。value); – Digitalex

+0

Type.Parse()は存在しないようです。万一Type.GetType()を意味しましたか? –

2

あなたがしようとしていることを正確に行うことはできません。まず、typeofキーワードでは、実行時に動的評価ができません。 Type.GetType(string)などの方法でリフレクションを使用してこれを行う手段がありますが、これらの反射関数から返されるTypeオブジェクトはキャスティングのような操作に使用できません。

あなたの行う必要があるのは、あなたのタイプを文字列表現に変換する方法です。任意のタイプからの自動変換はありません。たとえば、bool.Parseまたはbool.TryParseを使用できますが、これはboolタイプに固有のものです。ほとんどのプリミティブ型にも同様のメソッドがあります。

+0

私はストリングを通過しました。 – Slion

1

シンプルなソリューションを、可能なタイプの限られた数があると仮定すると、

object GetValueObject(string type, string value) 
{ 
    switch (type) 
    { 
    case "System.Boolean": 
     return Boolean.Parse(value); 
    case "System.Int32": 
     return Int32.Parse(value); 
    ... 
    default: 
     return value; 
    } 
} 

var type = publishNode.Attributes["Type"].value; 
var value = publishNode.InnerText; 
var valueObject = GetValueObject(type, value); 
+0

私は.NET Framework 2.0で作業しています。私はvarを持っていません。 あなたが提案した解決策は、無数にあるすべてのタイプのオブジェクトの作成を実装する工場です。 しかし、とにかく助けてくれてありがとう。 – LolaRun

+0

まあ、varはちょうどコードを短くすることでした、あなたは文字列、文字列、これらの3つの代わりにオブジェクトを使用することができます。そして、私が言ったように、あなたが限られた数の型をサポートする必要があるならば、これはうまくいくでしょう。そうでなければ、それは実用的ではないと言う権利があります。 – Digitalex

+1

C#6では、たとえば 'case nameof(System.Guid):'を使用できます。 const文字列の必要はもうありません。 nameofは生成されたコンパイル時間です。 –

関連する問題