XmlTextWriter继承和强制转换异常

时间:2015-06-23 19:05:37

标签: c# .net xml inheritance casting

我想创建一个XmlTextWriter的扩展,其中包含许多自定义方法,用我自己的文件格式记下我使用的类和结构(我不想使用序列化,因为有时标记嵌套可能非常深层次因此定义所有XmlElement属性并创建所有必要的投影将是相当繁琐的。 这是我做的:

public sealed class MySpecialWriter : XmlTextWriter
{
    private static readonly XmlWriterSettings s_DefaultSettings = new XmlWriterSettings
    {
        CloseOutput = true,
        Encoding = new UTF8Encoding(false),
        Indent = true,
        IndentChars = "\t",
        NewLineChars = Environment.NewLine,
        NewLineHandling = NewLineHandling.Replace,
        OmitXmlDeclaration = false,
    };

    public MySpecialWriter(Stream output, Encoding encoding) : base(output, encoding) { }

    public MySpecialWriter(String output, Encoding encoding) : base(output, encoding) { }

    public MySpecialWriter(TextWriter output) : base(output) { }

    public static MySpecialWriter Initialize(StringBuilder sb)
    {
        return (MySpecialWriter)Create(sb, s_DefaultSettings);
    }

    public void WriteMyClass(MyClass value)
    {
        ...
    }
}

当我尝试使用它时(只是一个简单的测试,看看它是否有效):

StringBuilder sb = new StringBuilder();

try
{
    using (MySpecialWriter writer = MySpecialWriter.Initialize(sb))
    {
        writer.WriteProcessingInstruction("xml", "version='1.0' encoding='UTF-8'");
        writer.WriteMyClass(value)
        writer.Flush();
    }
}
catch (Exception e)
{
    return null;
}

return sb.ToString();

我得到以下异常来自"初始化"方法:

无法转换类型&System; System.Xml.XmlWellFormedWriter'的对象输入' System.Xml.XmlTextWriter'。

你能帮我吗?

1 个答案:

答案 0 :(得分:2)

执行此操作时:

return (MySpecialWriter)Create(sb, s_DefaultSettings);

Create引用XmlWriter.Create方法,该方法返回XmlTextWriter的实例,而不是MySpecialWriter的实例,因此转换失败。您应该使用new来创建班级的实例。

无论如何,我认为你真的不需要在这里继承XmlTextWriter(除非你特别需要使用XmlTextWriter的受保护方法,这是不太可能的)。您可以通过编写XmlWriter的扩展方法来获得相同的结果。