2008-09-16 49 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"; 
} 

,還有一些人...

相關問題