为什么这个Using()会给我一个错误

本文关键字:一个 错误 为什么 Using | 更新日期: 2023-09-27 18:06:34

我试图打开一个(实际上是数百)excel文件。我打开应用程序,但希望在打开的每个工作簿周围使用Using()功能。为什么这会导致错误?

using (Excel.Workbook wbXL = appXL.Workbooks.Open(_sourceFullPath, Type.Missing, Excel.XlFileAccess.xlReadOnly))
{
    //stuff with wbXL
}

using用红色下划线表示" Microsoft.Office.Interop.excel。"工作簿":在using语句中使用的类型必须隐式转换为"System.IDisposable"。

如何使这个工作?

为什么这个Using()会给我一个错误

差不多就是它说的——你只能在实现IDisposable的类中使用using,这样编译器就知道在结束时调用哪个函数了——yourclass.Dispose()。Excel的互操作类没有实现这个。

你有两个选择:

  1. 为Excel编写自己的包装器类。实现iddispose的工作簿,或者公开对象本身以调用方法,或者也包装这些方法,例如

    public class DisposableWorkbook : IDisposable
    {
        private Excel.Workbook _workbook = null;
        public DisposableWorkbook(Excel.Application appXL, String path,
                                  NotSureOfType otherArgument,
                                  Excel.XlFileAccess access)
        {
            _workbook = appXL.Workbooks.Open(path, otherArgument, access);
        }
        public Excel.Workbook Workbook
        {
            get { return _workbook; }
        }
        public void Dispose()
        {
            if (workbook != null)
            {
                workbook.Close(Excel.XlSaveAction.xlDoNotSaveChanges,
                               workbookToClose);
                workbook = null;
            }
        }
    }
    using (DisposableWorkbook dwbXL = new DisposableWorkbook(appXL,
              _sourceFullPath, Type.Missing, Excel.XlFileAccess.xlReadOnly))
    {
         Excel.Workbook wbXL = dwbXL.Workbook;
         // stuff with wbXL
    }
    
  2. 自己实现using,例如

    Excel.Workbook wbXL = null;
    try
    {
        wbxl = appXL.Workbooks.Open(_sourceFullPath, Type.Missing,
                                    Excel.XlFileAccess.xlReadOnly);
        //stuff with wbXL
    }
    finally
    {
        if (wbxl != null) wbxl.Close();
    }
    

using语句中的任何项都必须实现IDisposable接口。我手头没有文档,但我猜Excel.Workbook没有实现这个接口。

using Statement (c# Reference):

提供方便的语法,确保正确使用IDisposable对象。

Excel.Workbook没有实现IDisposable,所以你不能使用using .

你不能让它工作。

using块用于尽可能快速安全地从实现IDisposable接口的对象中释放资源。

Excel.Workbook没有实现IDisposable,所以你不能在using块中声明它。

Businessmanger emb = new Businessmanger();
        try
        {

            TempData["deparmentList"] = Deplist;
            return PartialView("create");
        }
        catch (Exception)
        {

            throw;
        }
        finally {
            //object dispose here
                            ((IDisposable)emb).Dispose();
        }
相关文章: