Многие параметры для взаимодействия с объектной моделью Office в VSTO требуют параметров объекта, которые передаются по ссылке, даже если условным типом параметра является int или строка.
Механизм, который я использовал (заимствованный из справки и ресурсов MSDN), по сути, создает общий объект, который содержит соответствующие данные, а затем передает их методу, например:
объект nextBookmarkName = "NextContent"; объект nextBookmark = this.Bookmarks.get_Item (ref nextBookmarkName) .Range;
Microsoft.Office.Interop.Word.Range newRng = this.Range (ref nextBookmark, ref nextBookmark);
Кажется, что это слишком много лишнего кода, но я не вижу лучшего способа сделать это. Я уверен, что что-то упускаю; что это такое? Или это действительно лучшая практика?





Меня это тоже заинтересует. Я пишу несколько приложений, которые используют автоматизацию в Word, и у меня даже есть такие вещи, как
object oFalse = false, oTrue = true, oOne = 1;
Это очень неприятно, но пока что это единственный способ, который я знаю.
Единственное, что я могу придумать, это написать класс-оболочку для часто используемых функций ...
Я думаю, это был просто плохой дизайн исходной объектной модели Word. Я знаю, что передача строк по ссылке может быть немного быстрее в мире COM, потому что это позволяет избежать необходимости делать копию, так что, возможно, это было частью оправдания. Но недостатком является то, что вызываемый объект может изменять значение, и в большинстве случаев с Word они являются входными параметрами.
Я считаю, что ваша техника - лучшая практика. Для миллионов необязательных параметров, которые требуются многим методам объектной модели Word, вы можете создать одно статическое поле, в котором «отсутствует» что-то вроде:
объект отсутствует = Type.Missing;
// Пример объект fileName = ... document.SaveAs (ref имя_файла, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует);
Вот чего я боялся. И FWIW, C# VSTO (я не знаю о VB.Net, так как никогда не использовал его) уже включает встроенный отсутствующий объект
Я согласен с Джо. Я даже разработал вспомогательные структуры и классы вроде этого:
internal struct Argument
{
internal static object False = false;
internal static object Missing = System.Type.Missing;
internal static object True = true;
}
И этот:
/// <summary>
/// Defines the "special characters"
/// in Microsoft Word that VSTO 1.x
/// translates into C# strings.
/// </summary>
internal struct Characters
{
/// <summary>
/// Word Table end-of-cell marker.
/// </summary>
/// <remarks>
/// Word Table end-of-row markers are also
/// equal to this value.
/// </remarks>
internal static string CellBreak = "\r\a";
/// <summary>
/// Word line break (^l).
/// </summary>
internal static string LineBreak = "\v";
/// <summary>
/// Word Paragraph break (^p).
/// </summary>
internal static string ParagraphBreak = "\r";
}
И еще несколько ...
Я думаю, обо всем этом позаботились VS.NET 2010 и новые языковые конструкции, представленные в C# 4.0 (в C# будут необязательные аргументы).
Смотрите видео Андерса Хейлберга на PDC 2008 на канале 9, чтобы узнать об изменениях, связанных с офисным развитием.
Я не могу найти эту ссылку, но это тоже может быть полезно. http://channel9.msdn.com/shows/Going+Deep/Inside-C-40-dynamic-type-optional-parameters-more-COM-friendly/
Это особенно неприятно в C#, где необязательные параметры запрещены, поэтому мне приходится часто использовать "ref missing" в качестве параметра.