1

许多与 VSTO 中的 Office 对象模型交互的参数都需要通过引用传递的对象参数,即使参数的名义类型是 int 或 string 也是如此。

  1. 我想使用这种机制是为了让代码可以修改参数,尽管我不明白为什么这些需要作为通用对象而不是更合适的类型传递。任何人都可以启发我吗?
  2. 我一直在使用的机制(取自帮助和 MSDN 资源)本质上创建了一个包含适当数据的通用对象,然后将其传递给方法,例如:

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

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

这似乎是很多额外的代码,但我看不到更好的方法。我确定我错过了一些东西;它是什么?或者这真的是最佳实践吗?

4

4 回答 4

2

我同意乔的观点。我什至开发了像这样的辅助结构和类:

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

还有一些...

于 2008-10-03T03:36:12.163 回答
0

我也会对这个感兴趣。我正在编写几个在 Word 中使用自动化的应用程序,我什至有类似的东西

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

这是非常讨厌的,但这是我迄今为止所知道的唯一方法。

我唯一能想到的就是为常用函数编写一个包装类......

于 2008-09-16T15:02:00.570 回答
0

我认为这只是原始 Word 对象模型的糟糕设计。我知道在 COM 世界中通过引用传递字符串可能会稍微快一些,因为它避免了复制的需要,所以这也许是理由的一部分。但缺点是被调用者可以修改值,并且在大多数情况下使用 Word 它们是输入参数。

我认为您的技术是最佳实践。对于许多 Word 对象模型方法所需的数百万个可选参数,您可以创建一个“缺少”的静态字段,例如:

对象丢失 = Type.Missing;

// 示例对象 fileName = ... document.SaveAs(ref fileName, ref 缺失, ref 缺失, ref 缺失, ref 缺失, ref 缺失, ref 缺失, ref 缺失, ref 缺失, ref 缺失, ref 缺失, ref 缺失, ref缺少,缺少参考,缺少参考,缺少参考);

于 2008-09-16T17:41:56.490 回答
0

我认为,所有这些都通过 VS.NET 2010 和 c# 4.0 中引入的新语言结构来处理(c# 将具有可选参数)。

有关与办公室开发相关的更改,请参阅频道 9 上 Anders Hejlberg 在 PDC 2008 上的视频。

我找不到该链接,但这也可能会有所帮助。
http://channel9.msdn.com/shows/Going+Deep/Inside-C-40-dynamic-type-optional-parameters-more-COM-friendly/

于 2008-11-02T08:31:07.353 回答