Рекомендации по передаче параметров в Microsoft Visual Studio Tools for Office (VSTO) 3 (C #)

StackOverflow https://stackoverflow.com/questions/73261

Вопрос

Многие параметры для взаимодействия с объектной моделью Office в VSTO требуют параметров объекта, которые передаются по ссылке, даже если условным типом параметра является int или string .

  1. Я полагаю, что этот механизм используется для того, чтобы код мог изменять параметр, хотя я не могу понять, почему они должны передаваться как универсальный объект, а не как их более подходящие типы.Кто-нибудь может меня просветить?
  2. Механизм, который я использовал (списанный из ресурсов справки и MSDN), по сути, создает универсальный объект, содержащий соответствующие данные, а затем передает их методу, например:

    объект nextBookmarkName = "NextContent";объект nextBookmark = this.Bookmarks.get_Item(ссылка на nextBookmarkName ).Диапазон;

    Майкрософт.Офис.Interop.Word.Range newRng = этот.Диапазон (ссылка на nextBookmark, ссылка на nextBookmark);

Это кажется большим количеством дополнительного кода, но я не вижу лучшего способа сделать это.Я уверен, что что-то упускаю;что это?Или это действительно лучшая практика?

Это было полезно?

Решение

Я думаю, что это был просто плохой дизайн исходной объектной модели Word.Я знаю, что передача строк по ссылке может быть немного быстрее в мире COM, потому что это позволяет избежать необходимости создавать копию, так что, возможно, это было частью обоснования.Но недостатком является то, что вызываемый объект может изменять значение, и в большинстве случаев в Word они являются входными параметрами.

Я думаю, что ваша техника - лучшая практика.Для миллионов необязательных параметров, которые требуются многим методам объектной модели Word, вы можете создать единственное статическое поле, в котором "отсутствует" что-то вроде:

отсутствует объект = Тип.Отсутствует;

// Пример имя файла объекта = ...документ.SaveAs(имя файла ссылки, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует);

Другие советы

Я согласен с Джо.Я даже разработал вспомогательные структуры и классы, подобные этому:

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";
}

И еще несколько...

Мне бы это тоже было интересно.Я кодирую несколько приложений, которые используют автоматизацию в Word, и у меня даже есть такие вещи, как

object oFalse = false, oTrue = true, oOne = 1;

Это очень противно, но пока это единственный известный мне способ.

Единственное, что я могу придумать, - это написать класс-оболочку для часто используемых функций...

Я думаю, обо всем этом позаботились в 2010 году VS.NET и новых языковых конструкциях, представленных в c # 4.0 (c # будет иметь необязательные аргументы).

Смотрите видео Андерса Хейлберга на PDC 2008 на 9 канале об изменениях, связанных с разработкой office.

Я не могу найти эту ссылку, но это также может быть полезно.
http://channel9.msdn.com/shows/Going+Deep/Inside-C-40-dynamic-type-optional-parameters-more-COM-friendly/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top