我正在尝试从一个方法中返回SqlXml对象,该方法使用方法本地内存流进行初始化。即:
我希望避免调用者必须传递流并负责其生命周期。是否有其他完全初始化SqlXml对象并安全释放内存流的方法?
编辑:
一种可能的解决方案是使用临时SqlXml变量,然后通过创建读取器构造函数使用它来初始化返回对象:
但是对我来说,这仍然看起来有点笨重。
using (Stream memoryStream = new MemoryStream())
{
using (XmlWriter writer = XmlWriter.Create(memoryStream, new XmlWriterSettings { OmitXmlDeclaration = true }))
{
serializer.Serialize(writer, myList.ToArray(), ns);
return new SqlXml(memoryStream);
}
}
现在调用它并尝试访问其字段的方法会失败,并出现一个“对象已释放异常”。
我快速浏览了SqlXml.cs,发现它只是保持对描述行为的流的引用。
public SqlXml(Stream value) {
// whoever pass in the stream is responsible for closing it
// similar to SqlBytes implementation
if (value == null) {
SetNull();
}
else {
firstCreateReader = true;
m_fNotNull = true;
m_stream = value;
}
我希望避免调用者必须传递流并负责其生命周期。是否有其他完全初始化SqlXml对象并安全释放内存流的方法?
编辑:
一种可能的解决方案是使用临时SqlXml变量,然后通过创建读取器构造函数使用它来初始化返回对象:
using (Stream memoryStream = new MemoryStream())
{
using (XmlWriter writer = XmlWriter.Create(memoryStream, new XmlWriterSettings { OmitXmlDeclaration = true }))
{
serializer.Serialize(writer, myList.ToArray(), ns);
SqlXml s = new SqlXml(memoryStream);
return new SqlXml(s.CreateReader());
}
}
但是对我来说,这仍然看起来有点笨重。