在Office(VSTO)3(C#)的Microsoft Visual Studio工具中传递参数的最佳实践
用于与VSTO中的Office对象模型进行交互的许多参数都需要通过引用传递的对象参数,即使参数的概念类型是int或者字符串。
- 我想使用这种机制是为了使代码可以修改参数,尽管我无法弄清楚为什么需要将这些作为通用对象而不是作为更合适的类型来传递。谁能启发我?
- 我一直使用的机制(从帮助和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);
这似乎是很多额外的代码,但是我看不到更好的方法。我确定我缺少了一些东西;它是什么?还是这真的是最佳做法?
解决方案
回答
我也会对此感兴趣。我正在编写几个在Word中使用自动化的应用程序,甚至有类似的东西
object oFalse = false, oTrue = true, oOne = 1;
这很讨厌,但这是我到目前为止所知道的唯一方法。
我唯一能想到的就是为常用函数编写包装器类。
回答
我认为这只是原始Word对象模型的不良设计。我知道在COM世界中通过引用传递字符串可能会稍快一些,因为它避免了进行复制的需要,所以也许这是合理性的一部分。但是缺点是被调用者可以修改值,并且在大多数情况下,使用Word时,它们是输入参数。
我认为技术是最佳做法。对于许多Word对象模型方法所需要的数百万个可选参数,我们可以创建一个"缺失"的静态字段,例如:
缺少对象= Type.Missing;
// 例子
对象fileName = ...
document.SaveAs(ref fileName,ref缺失,ref缺失,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"; }
还有一些...
回答
我认为,所有这些都是通过VS.NET 2010和c4.0中引入的新语言结构(c具有可选参数)解决的。
有关与办公室开发相关的更改,请参见第9频道上Anders Hejlberg在PDC 2008上的视频。
我找不到该链接,但这也可能有所帮助。
http://channel9.msdn.com/shows/Going+Deep/Inside-C-40-dynamic-type-optional-parameters-more-COM-friendly/