Microsoft Visual Studio Tools for Office (VSTO) 3 (C#) でパラメーターを渡すためのベスト プラクティス
-
09-06-2019 - |
質問
VSTO で Office オブジェクト モデルと対話するためのパラメーターの多くは、パラメーターの概念的な型が int または string であっても、参照によって渡されるオブジェクト パラメーターを必要とします。
- このメカニズムは、コードがパラメーターを変更できるようにするために使用されていると思いますが、なぜこれらをより適切な型としてではなく汎用オブジェクトとして渡す必要があるのかわかりません。誰か私を教えてくれませんか?
私が使用してきたメカニズム (ヘルプと 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 オブジェクト モデルの設計が貧弱だっただけだと思います。COM の世界では文字列を参照渡しするとコピーを作成する必要がなくなるため、若干高速になることはわかっています。おそらくそれが正当化の一部だったのでしょう。ただし、欠点は呼び出し先が値を変更できることです。Word ではほとんどの場合、値は入力パラメーターです。
あなたのテクニックはベストプラクティスだと思います。Word オブジェクト モデル メソッドの多くが必要とする何百万ものオプション パラメーターについては、次のような「欠落している」単一の静的フィールドを作成できます。
オブジェクトが見つかりません = Type.Missing;
//例のオブジェクトFilename = ...document.saveas(ref filename、ref missing、rif missing、ref missing、ref missing、ref missing、ref missing、ref missing、ref missing、ref missing、ref missing、ref missing、ref missing、ref missing、ref missing、ref missing、ref missing、forking、ref missing、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";
}
そしてさらにいくつか...
これにも興味があります。Word でオートメーションを使用するいくつかのアプリをコーディングしています。次のようなものもあります。
object oFalse = false, oTrue = true, oOne = 1;
とても厄介なことですが、これが今のところ私が知っている唯一の方法です。
私が考えることができる唯一のことは、頻繁に使用される関数のラッパークラスを書くことです...
これらはすべて、VS.NET 2010 と C# 4.0 で導入された新しい言語構造 (C# にはオプションの引数があります) で処理されると思います。
オフィス開発に関連する変更については、チャンネル 9 の PDC 2008 での Anders Hejlberg によるビデオを参照してください。
そのリンクが見つかりませんが、これも役立つかもしれません。
http://channel9.msdn.com/shows/Going+Deep/Inside-C-40-dynamic-type-optional-parameters-more-COM-Friendly/