在 Microsoft Visual Studio Tools for Office (VSTO) 3 (C#) 中传递参数的最佳实践
-
09-06-2019 - |
题
许多与 VSTO 中的 Office 对象模型交互的参数都需要通过引用传递的对象参数,即使参数的名义类型是 int 或 string。
- 我认为使用这种机制以便代码可以修改参数,尽管我无法弄清楚为什么这些需要作为通用对象而不是作为更合适的类型传递。谁能启发我吗?
我一直在使用的机制(抄袭自帮助和 MSDN 资源)本质上是创建一个包含适当数据的通用对象,然后将其传递给方法,例如:
对象 nextBookmarkName = "下一个内容";对象 nextBookmark = this.Bookmarks.get_Item( ref nextBookmarkName ).Range;
Microsoft.Office.Interop.Word.Range newRng = this.Range( ref nextBookmark, ref nextBookmark );
这似乎有很多额外的代码,但我看不出更好的方法来做到这一点。我确信我错过了一些东西;它是什么?或者这真的是最佳实践吗?
解决方案
我认为这只是原始 Word 对象模型的糟糕设计。我知道在 COM 世界中通过引用传递字符串可能会稍微快一些,因为它避免了复制的需要,所以也许这就是理由的一部分。但缺点是被调用者可以修改该值,并且在大多数情况下,对于 Word,它们是输入参数。
我认为你的技术是最好的实践。对于许多 Word 对象模型方法所需的数百万个可选参数,您可以创建一个“缺失”的静态字段,如下所示:
对象缺失 = Type.Missing;
//示例对象文件名= ...document.saveas(ref文件名,裁判失踪,裁判失踪,裁判失踪,裁判失踪,裁判失踪,裁判失踪,裁判失踪,裁判失踪,裁判失踪,裁判失踪,裁判丢失,裁判丢失,裁判失踪,裁判丢失的);
其他提示
我同意乔的观点。我什至开发了像这样的辅助结构和类:
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;
这非常令人讨厌,但这是迄今为止我所知道的唯一方法。
我唯一能想到的就是为常用的函数编写一个包装类......
我认为,所有这些都可以通过 VS.NET 2010 和 c# 4.0 中引入的新语言结构来解决(c# 将有可选参数)。
请参阅 Channel9 上 Anders Hejlberg 在 PDC 2008 上的视频,了解与办公室开发相关的变化。
我找不到该链接,但这也可能有帮助。
http://channel9.msdn.com/shows/Going+Deep/Inside-C-40-dynamic-type-optional-parameters-more-COM-Friendly/