2016-04-28 150 views
0

我使用一個程序來讀取數據從XML文件與此類似:爲什麼我的演員無效?

<VerificationSample X1 = "1" X3 = "3" ../> 

使用此電話:

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」'。這不能轉換爲「雙」。 –

+0

@john,但是如果讀者從文件中讀取「0」,這是一個字符串。有用。如果我做這個'value =「0」;返回值;'它也行不通。爲什麼? –

+0

當您從文件中讀取「0」時,您會遇到一些麻煩,將其轉換爲請求的類型。當請求的屬性不存在時,您不會運行該代碼路徑。 –

回答

2

如果該屬性不存在,那麼您return "0",然後您試圖將其轉換爲double。你需要返回默認值什麼的objectType是,也許是做

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

,如果你嘗試轉換的東西非一成不變像一個類,而不是一個int或字符串,它會吹你只會返回null反正你的功能;它就在那裏,所有的代碼路徑都會返回一些東西。

+0

但我不想在任何情況下都返回null嗎?那麼我應該在哪裏放一段代碼?此外,如果你可以向我解釋爲什麼如果讀者從文件中讀取「0」,這是一個字符串,它工作正常 –

+0

我剛剛改變了我的'返回0「;'你的'返回Activator.CreateInstance(objectType );'謝謝 –

+1

如果你從文件中讀取「0」,它將被轉換器轉換;如果您返回「0」,則不會。 –

3

因爲你正在返回「0」,這是一個字符串,你不能將它轉換爲double。改用Convert.toDouble(String s)。

+0

我明白了。這是一個混亂,因爲它讀取文件中的「0」就好了。您的解決方案奏效謝謝。但如果它不是雙重的呢?我需要使其通用 –