2016-04-28 112 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”就好了。您的解决方案奏效谢谢。但如果它不是双重的呢?我需要使其通用 –