2008-09-16 25 views
1

与VSTO中的Office对象模型进行交互的许多参数都需要通过引用传递的对象参数,即使名义类型该参数是一个int或字符串。在Microsoft Visual Studio Tools for Office(VSTO)3(C#)中传递参数的最佳做法

  1. 我想,这种机制被使用,以便代码可以修改参数,但我想不出为什么这些需要作为一般对象,而不是他们的更合适类型的传递。任何人都可以启发我吗?
  2. 我已经使用(从帮助和MSDN资源那儿剽窃)实质上创建包含相应数据的通用对象,然后经过的机制,该方法,例如:

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

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

这看起来像很多额外的代码,但我看不到更好的方式来做到这一点。我确定我错过了一些东西;它是什么?或者这是否是最佳做法?

+0

这在C#中尤其令人沮丧,其中可选参数是否定的,所以我最终不得不使用“ref missing”作为参数。 – cori 2008-09-16 17:22:11

回答

0

我认为这是原始的Word对象模型的设计,只是差。我知道在COM世界中通过引用传递字符串可以稍微快一点,因为它避免了复制的必要性,所以也许这就是证明的一部分。但缺点是被调用者可以修改该值,而在大多数情况下,它们是输入参数。

我认为你的技术是最好的做法。对于许多Word对象模型方法需要的数百万个可选参数,您可以创建一个“缺失”类似的单个静态字段:

object missing = Type.Missing;

//例 目标文件名= ... document.SaveAs(参考文件名,REF缺失,REF缺失,REF缺失, REF缺失,REF缺失,REF缺失,REF缺失,REF缺失, REF失踪,裁判失踪,裁判失踪,裁判失踪,裁判失踪, 裁判失踪,裁判失踪);

+0

这就是我所害怕的。和FWIW,C#VSTO(我不知道VB.Net,因为我从来没有用过它)已经包含一个内置的缺失对象 – cori 2008-09-17 02:33:38

0

我也会对此感兴趣。我编码的几个应用程序在Word中使用自动化,我甚至有事情像

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

这是非常讨厌的,但它是我目前所知的唯一途径。

我能想到的是写一个包装类的常用功能的唯一的事情...

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

,还有一些人...

相关问题