在C#中执行

时间:2019-05-05 23:17:13

标签: c# .net design-patterns lambda delegates

我正在尝试实施Kent Beck的Smalltalk最佳实践模式中所述的执行各地模式。可以在Java中找到一个示例here

基本上,我在执行各种操作时反复打开和关闭pdf文档,例如

public void Parse()
{
    // Open the document
    PdfLoadedDocument loadedDocument = new PdfLoadedDocument("plan.pdf");

    List<string> annotations = Build(loadedDocument);

    // Close the document
    loadedDocument.Save();
    loadedDocument.Close();
}

我想将打开和关闭文档的位置集中,因为我有数十种类似的方法。所有这些方法都可以打开文档,执行操作并关闭文档,很容易忘记关闭文档。

这是我尝试过的:

public void BuildAnnotations()
{
    List<string> annotations = null;

    ExecuteAction("plan.pdf", (PdfLoadedDocument loadedDocument) =>
    {
        annotations = Build(loadedDocument);
    });
}

private void ExecuteAction(string path, Action<PdfLoadedDocument> perform)
{
    PdfLoadedDocument loadedDocument = new PdfLoadedDocument(path);

    try
    {
        perform(loadedDocument);
    }
    catch(Exception e)
    {
        Console.WriteLine($"An error occured. {e}");
    }

    loadedDocument.Save();
    loadedDocument.Close();
}

我的问题是,将lambda传递给Action代表是一个好主意吗?我对委托,操作和lambda不太熟悉(除了在linq查询中使用它们)。还有其他更好的选择吗?

1 个答案:

答案 0 :(得分:2)

您是否考虑过实现IDisposable接口,所以以后可以使用using关键字,例如:

using (PdfLoadedDocument loadedDocument = new PdfLoadedDocument(path))
{
    List<string> annotations = Build(loadedDocument);
}

public class PdfLoadedDocument : IDisposable
{
    public void Close()
    {

    }

    public void Save()
    {

    }

    public void Dispose()
    {
        Save();
        Close();
    }
}