我正在使用例程来读取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";
}
}
如果该属性不存在,则应用程序弹出错误:
指定的演员表无效
我的错误是什么?
答案 0 :(得分:3)
因为你要回来&#34; 0&#34; ,这是一个字符串,你不能将其转换为双倍。改为使用Convert.toDouble(String s)。
答案 1 :(得分:2)
如果该属性不存在,则为return "0"
,然后您尝试将其转换为double。您需要返回objectType
的默认值,可能是通过执行
else // attribute doesn't exist
{
if(objectType.IsValueType)
{
return Activator.CreateInstance(objectType);
}
return null;
}
如果你试图转换为类不可变的东西而不是像int或字符串一样,你只会返回null,这会破坏你的功能;它就在那里,所以所有的代码路径都会返回一些东西。