可以使用T4模板生成手动Dispose() - 来自“using”语句的代码吗?

时间:2014-04-13 18:09:56

标签: c# code-generation t4 idisposable using

我正在使用这个pattern滥用IDisposable的用法来正确格式化xml的输出:

public class XmlDisposable : IDisposable
{
    private TextWriter xml;
    private string tag;
    public XmlDisposable(TextWriter xml, string tag)
    {
        this.xml = xml;
        this.tag = tag;
        xml.Write("<" + tag + ">");
    }

    public void Dispose()
    {
        xml.WriteLine("</" + tag + ">");
    }
}

public static XmlDisposable Note(this TextWriter xml)
{
    return new XmlDisposable(xml, "note");
}

public static XmlDisposable Body(this TextWriter xml)
{
    return new XmlDisposable(xml, "body");
}

用法:

public void WriteNote(TextWriter xml, string bodyText)
{
    using (xml.Note())
    {
        using (xml.Body())
        {
            xml.Write(bodyText);
        }
    }
}

这是有效的,因为编译器将使用“try ... finally”语句替换using。

我的问题如下: 我是否可以使用T4模板修改源文件,以便“using(xml ...())”的每个块将替换为以下内容:

 var xml = new XmlDisposable(xmlWriter, tagName);
 ...
 (xml as IDisposable).Dispose();

我知道这样做可能不是一个好主意,因为维护模板以及生成代码会产生额外的开销,但我只是好奇它是否可以完成。

谢谢!

0 个答案:

没有答案