我想创建一个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'。
你能帮我吗?
答案 0 :(得分:2)
执行此操作时:
return (MySpecialWriter)Create(sb, s_DefaultSettings);
Create
引用XmlWriter.Create
方法,该方法返回XmlTextWriter
的实例,而不是MySpecialWriter
的实例,因此转换失败。您应该使用new
来创建班级的实例。
无论如何,我认为你真的不需要在这里继承XmlTextWriter
(除非你特别需要使用XmlTextWriter
的受保护方法,这是不太可能的)。您可以通过编写XmlWriter
的扩展方法来获得相同的结果。