XmlTextWriter继承和强制转换异常

本文关键字:转换 异常 继承 XmlTextWriter | 更新日期: 2023-09-27 17:59:09

我想用很多自定义方法创建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.Xml.XmlWellFormedWriter"类型的对象强制转换为"System.Xml.Xml TextWriter"类型。

你能帮我吗?

XmlTextWriter继承和强制转换异常

执行此操作时:

return (MySpecialWriter)Create(sb, s_DefaultSettings);

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

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