为什么我的演员表无效?

时间:2016-04-28 18:42:49

标签: c# xml

我正在使用例程来读取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";
    }
}

如果该属性不存在,则应用程序弹出错误:

  

指定的演员表无效

我的错误是什么?

2 个答案:

答案 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,这会破坏你的功能;它就在那里,所以所有的代码路径都会返回一些东西。