Raghav Panalkar Ответов: 1

Невозможно привести объект типа "iTextsharp.text.html.simpleparser.cellwrapper" к типу "iTextsharp.text.paragraph".


Я получаю вышеописанную ошибку, которую я пытался связать список и все, и результат дает мне какую-то другую ошибку, например HTMLWorkHelper и ошибку конвертера абзацев и т. д.
и я использую Itextsharp версии 5.4.1,
и пока я гуглю, он говорит, что обновился до новой версии.

Что я уже пробовал:

protected void ExportToPDF(object sender, EventArgs e)
       {
           Response.ContentType = "application/pdf";
           Response.AddHeader("content-disposition", "attachment;filename=TestPage.pdf");
           Response.Cache.SetCacheability(HttpCacheability.NoCache);
           StringWriter sw = new StringWriter();
           HtmlTextWriter hw = new HtmlTextWriter(sw);
           PanelHistoryNew.RenderControl(hw);
           StringReader sr = new StringReader(sw.ToString());
           Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 100f, 0f);
           HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
           PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
           pdfDoc.Open();
           htmlparser.Parse(sr);
           pdfDoc.Close();
           Response.Write(pdfDoc);
           Response.End();
       }

Richard MacCutchan

Скорее всего, потому, что они не основаны на одном и том же типе объекта.

Gerry Schmitz

Никакой проверки ошибок. Никакой проверки результатов. Тебе уже ничем не поможешь.

1 Ответов

Рейтинг:
11

OriginalGriff

Вы можете выполнять приведение только между "связанными" типами или между типами, для которых определен оператор приведения (используя либо explicit или implicit ключевые слова : Операторы преобразования - руководство по программированию на C# | Microsoft Docs[^]

Подумайте об этом: если вы объявите три класса:

public class Fruit {...}
public class Apple : Fruit {...}
public class Orange : Fruit {...}
Затем вы можете бросить яблоко на фрукт, или апельсин на фрукт, или фрукт на яблоко или апельсин (но вы можете получить ошибку времени выполнения, если попытаетесь) - но вы не можете бросить апельсин на яблоко или наоборот (и именно поэтому вы можете получить ошибку времени выполнения, о которой я упоминал), потому что яблоко содержит информацию, которую апельсин не содержит: возможно, метод RemoveCore. И если бы вы могли привести его, то при попытке вызвать RemoveCore он потерпел бы неудачу во время выполнения, потому что он не может найти метод.

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

Чтобы сделать любое другое литье, вам нужно точно сказать системе, что можно отлить, доказав explicit или implicit операторы на самом деле это делают.

И это то, что вы сообщаете об ошибке: "этот объект не может быть преобразован в этот тип", поэтому используйте компилятор (если он генерирует ошибку) или отладчик (если ваш код компилируется) и посмотрите на фактическую строку, которая дает ошибку, чтобы узнать, какие данные вы пытаетесь преобразовать или передать неправильно.

Мы не можем сделать это для вас!


Raghav Panalkar

Спасибо за объяснение.

OriginalGriff

Всегда пожалуйста!