Почему это использование () дает мне ошибку? - PullRequest
8 голосов
/ 25 августа 2011

Я пытаюсь открыть (сотни на самом деле) файлы Excel.Я открываю приложение, но хочу использовать функцию Using () для каждой открываемой книги.Почему это приводит к ошибке?

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

using получает красное подчеркивание и говорит: «Microsoft.Office.Interop.excel.Workbook»: тип, используемый в операторе using, должен быть неявно преобразован в «System»..IDisposable '.

Как заставить это работать?

Ответы [ 5 ]

30 голосов
/ 25 августа 2011

Почти то, что написано - вы можете использовать using только с классами, которые реализуют IDisposable, так что под прикрытием компилятор знает, какую функцию вызывать при финализации - yourclass.Dispose(). Классы взаимодействия Excel не реализуют это.

Итак, у вас есть два варианта:

  1. Напишите свой собственный класс-оболочку для Excel.Workbook, который реализует IDispose и либо предоставляет сам объект для вызова методов, либо оборачивает эти методы тоже, например,

    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();
    }
    
2 голосов
/ 25 августа 2011

Любой элемент в выражении using должен реализовывать интерфейс IDisposable.У меня нет документации, но я думаю, Excel.Workbook не реализует этот интерфейс.

1 голос
/ 25 августа 2011

Вы не можете заставить это работать.

Блок using используется для максимально быстрого и безопасного освобождения ресурсов от объектов, реализующих интерфейс IDisposable.

Excel.Workbook не реализует IDisposable, поэтому вы не можете объявить его для использования в using блоке.

1 голос
/ 25 августа 2011

с использованием Statement (C # Reference) :

Предоставляет удобный синтаксис, обеспечивающий правильное использование IDisposable объектов.

Excel.Workbookне реализует IDisposable, поэтому вы не можете использовать using для него ..

0 голосов
/ 23 июня 2014
Businessmanger emb = new Businessmanger();
        try
        {


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


            throw;
        }
        finally {
            //object dispose here
                            ((IDisposable)emb).Dispose();
        }
...