Лучшие практики для передачи параметров в Microsoft Visual Studio Tools for Office (VSTO) 3 (C #) - PullRequest
1 голос
/ 16 сентября 2008

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

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

    object nextBookmarkName = "NextContent"; object nextBookmark = this.Bookmarks.get_Item (ref nextBookmarkName) .Range;

    Microsoft.Office.Interop.Word.Range newRng = this.Range (ref nextBookmark, ref nextBookmark);

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

Ответы [ 4 ]

2 голосов
/ 03 октября 2008

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

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

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

0 голосов
/ 02 ноября 2008

Я думаю, обо всем этом заботятся 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/

0 голосов
/ 16 сентября 2008

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

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

объект отсутствует = Type.Missing;

// Пример объект fileName = ... document.SaveAs (ref fileName, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует);

0 голосов
/ 16 сентября 2008

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

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

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

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

...