2016-04-28 4 views
0

私はXMLは次のようなファイルからデータを読み取るためのルーチンを使用していますがなぜ私のキャストが有効でないのですか?</p> <pre><code><VerificationSample X1 = "1" X3 = "3" ../> </code></pre> <p>このコール使用:

XmlReader reader = XmlReader.Create(path); 
reader.ReadToFollowing("VerificationSample"); 

this.X1 = (double)FileStructure.GetAttributeSafe(reader, "X1", typeof(double)); // exists 
this.X2 = (double)FileStructure.GetAttributeSafe(reader, "X2", typeof(double)); // doesn't exist 

を、いくつかの属性は、私はそれが内部にこのルーチンを使用して扱うように存在しない可能性がありますその属性リーダー機能の定義:

public static object GetAttributeSafe(XmlReader reader, string attributeName, Type objectType) 
{ 
    // .. 
    string value = reader.GetAttribute(attributeName); 

    if (value != null) // attribute exists 
    { 
     if (objectType != typeof (string)) 
     { 
      var converter = TypeDescriptor.GetConverter(objectType); 
      returnValue = converter.ConvertFrom(value); 
     } 

     else // is already a string and doesn't need to be converted 
     { 
      return value; 
     } 
    } 
    else // attribute doesn't exist 
    { 
     return "0"; 
    } 
} 

属性が存在しない場合、アプリケーションがエラーをポップ:

Specified cast is not valid

私の間違いは何ですか?

+0

属性が存在しない場合、メソッドは* 'string' *' "0" 'を返します。これは 'double'にキャストできません。 –

+0

@johnしかし、読者が文字列であるファイルから '' 0 ''を読んだ場合、できます。そして、私がこれを行うと 'value =" 0 ";戻り値;それはまた動作しません。どうして? –

+0

ファイルから「0」を読み込むと、問題のあるタイプに変換するのに問題が発生します。要求された属性が存在しない場合は、そのコードパスを実行しません。 –

答えて

2

属性が存在しない場合は、return "0"をダブルクリックしてキャストしようとしています。あなたはおそらく行うことによって、objectTypeが何であれ、デフォルトの値を返す必要が

else // attribute doesn't exist 
{ 
    if(objectType.IsValueType) 
    { 
     return Activator.CreateInstance(objectType); 
    } 
    return null; 
} 

あなたが爆破する代わりに、int型や文字列のクラスのような非不変なもの、に変換しようとした場合にのみ、nullを返しますとにかくあなたの機能をアップ。すべてのコードパスが何かを返すようにするだけです。

+0

しかし、私はどんな場合でも 'return null 'を望んでいないのですか?だから私はあなたのコードを置くべきですか?また、読者が文字列であるファイルから '' 0 ''を読み込んだ場合、なぜそれがうまく動作するのかを私に説明することができます –

+0

私は' 'return" 0 ";'をあなたの '' Activator.CreateInstance(objectType ); 'ありがとう –

+1

ファイルから' '0 ''を読むと、 '' converter''によって変換されます。あなたが '' 0 ''を返すならば、それはしません。 –

3

文字列である "0"が返されているため、これを二重にキャストできません。代わりにConvert.toDouble(String s)を使用してください。

+0

私は参照してください。 '' 0 ''をファイルからうまく読み込むので、混乱します。ソリューションが機能しました。ありがとう。しかし、もしそれが二重でないなら、どうでしょうか?私はそれを一般的にする必要があります –

関連する問題