Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
static void ExportToExcel(List<Car> carsInStock)
{
<b> // Загрузить Excel и затем создать новую пустую рабочую книгу.</b>
Excel.Application excelApp = new Excel.Application();
<b> // Сделать пользовательский интерфейс Excel видимым на рабочем столе.</b>
excelApp.Visible = true;
...
}
После создания пустого рабочего листа добавляются три столбца, именованные в соответствии со свойствами класса
Car
List<Car>
Inventory.xlsx
Если вы запустите приложение, то сможете затем открыть файл
Inventory.xlsx
binDebugnet5.0
Хотя не похоже, что в предыдущем коде использовались какие-либо динамические данные, имейте в виду, что среда DLR оказала значительную помощь. Без среды DLR код пришлось записывать примерно так:
static void ExportToExcelManual(List<Car> carsInStock)
{
Excel.Application excelApp = new Excel.Application();
// Потребуется пометить пропущенные параметры!
excelApp.Workbooks.Add(Type.Missing);
// Потребуется привести объект Object к _Worksheet!
Excel._Worksheet workSheet =
(Excel._Worksheet)excelApp.ActiveSheet;
// Потребуется привести каждый объект Object к Range
// и затем обратиться к низкоуровневому свойству Value2!
((Excel.Range)excelApp.Cells[1, "A"]).Value2 = "Make";
((Excel.Range)excelApp.Cells[1, "B"]).Value2 = "Color";
((Excel.Range)excelApp.Cells[1, "C"]).Value2 = "Pet Name";
int row = 1;
foreach (Car c in carsInStock)
{
row++;
// Потребуется привести каждый объект Object к Range
// и затем обратиться к низкоуровневому свойству Value2!
((Excel.Range)workSheet.Cells[row, "A"]).Value2 = c.Make;
((Excel.Range)workSheet.Cells[row, "B"]).Value2 = c.Color;
((Excel.Range)workSheet.Cells[row, "C"]).Value2 = c.PetName;
}
// Потребуется вызвать метод get _ Range()
// с указанием всех пропущенных аргументов!
excelApp.get_Range("A1", Type.Missing).AutoFormat(
Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2,
Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing);
// Потребуется указать все пропущенные необязательные аргументы!
workSheet.SaveAs(
$@"{Environment.CurrentDirectory}InventoryManual.xlsx",
Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing);
excelApp.Quit();
Console.WriteLine("The InventoryManual.xslx file has been saved to your app folder");
// Файл Inventory.xslx сохранен в папке приложения.
}
На этом рассмотрение ключевого слова
dynamic
В то время как о среде DLR можно еще рассказать многое, основное внимание в главе было сосредоточено на темах, практичных и полезных при повседневном программировании. Если вы хотите изучить расширенные средства DLR, такие как интеграция с языками написания сценариев, тогда обратитесь в документацию по .NET Core (начните с поиска темы "Dynamic Language Runtime Overview" ("Обзор исполняющей среды динамического языка")).
Резюме
Ключевое слово
dynamic
С применением динамических данных и среды DLR сложные задачи программирования на C# могут быть радикально упрощены, особенно действие по включению библиотек СОМ в состав приложений .NET Core. Было показано, что это предлагает несколько дальнейших упрощений взаимодействия с СОМ (которые не имеют отношения к динамическим данным), в том числе встраивание данных взаимодействия СОМ в разрабатываемые приложения, необязательные и именованные аргументы.
Хотя все рассмотренные средства определенно могут упростить код, всегда помните о том, что динамические данные существенно снижают безопасность к типам в коде C# и открывают возможности для возникновения ошибок времени выполнения. Тщательно взвешивайте все "за" и "против" использования динамических данных в своих проектах C# и надлежащим образом тестируйте их!
Глава 19
Язык CIL и роль динамических сборок
При построении полномасштабного приложения .NET Core вы почти наверняка будете использовать C# (или другой управляемый язык, такой как Visual Basic) из-за присущей ему продуктивности и простоты применения. Однако в начале книги было показано, что роль управляемого компилятора заключается в трансляции файлов кода
*.cs
ilasm.ехе