COM 相互運用機能を使用したプログラミングでインデックス付きプロパティを使用する方法

インデックス付きプロパティは、名前付き引数と省略可能な引数、新しい型 (dynamic)、埋め込み型情報などの C# の他の機能と連携して、Microsoft Office プログラミングをいっそう強力なものにします。

重要

VSTO (Visual Studio Tools for Office) は、.NET Framework に依存しています。 COM アドインも .NET Framework を使用して記述することができます。 Office アドインは、.NET Core と .NET 5+ (.NET の最新バージョン) では作成できません。 これは、.NET Core と .NET 5+ を .NET Framework と同じプロセスで動作させることができず、アドインの読み込みエラーが発生する可能性があるためです。 引き続き .NET Framework を使用して、Office 用の VSTO アドインと COM アドインを記述できます。 Microsoft が VSTO または COM アドイン プラットフォームを、.NET Core または .NET 5+ を使用するように更新することはありません。 .NET Core と .NET 5+ (ASP.NET Core を含む) を利用して、Office Web アドインのサーバー側を作成できます。

以前のバージョンの C# では、プロパティとしてメソッドにアクセスできるのは、get メソッドがパラメーターを持たず、set メソッドが 1 つだけ値パラメーターを持つ場合に限られました。 しかし、すべての COM プロパティがこのような制限を満たしているわけではありません。 たとえば、Excel の Range[] プロパティには、範囲の名前のパラメーターを必要とする get アクセサーがあります。 これまでは、このような Range プロパティに直接アクセスすることはできず、次の例に示すように、get_Range メソッドを代わりに使う必要がありました。

// Visual C# 2008 and earlier.
var excelApp = new Excel.Application();
// . . .
Excel.Range targetRange = excelApp.get_Range("A1", Type.Missing);

インデックス付きプロパティを使うと、次のようなコードを記述できます。

// Visual C# 2010.
var excelApp = new Excel.Application();
// . . .
Excel.Range targetRange = excelApp.Range["A1"];

また、前の例では、省略可能な引数機能も使われており、Type.Missing を省略できます。

インデックス付きプロパティを使うと、次のようなコードを記述できます。

// Visual C# 2010.
targetRange.Value = "Name";

独自のインデックス付きプロパティを作成することはできません。 この機能では、既存のインデックス付きプロパティの使用のみがサポートされます。

次に完全なコードの例を示します。 Office API にアクセスするプロジェクトを設定する方法の詳細については、「C# の機能を使用して Office 相互運用オブジェクトにアクセスする方法」をご覧ください。

// You must add a reference to Microsoft.Office.Interop.Excel to run
// this example.
using System;
using Excel = Microsoft.Office.Interop.Excel;

namespace IndexedProperties
{
    class Program
    {
        static void Main(string[] args)
        {
            CSharp2010();
        }

        static void CSharp2010()
        {
            var excelApp = new Excel.Application();
            excelApp.Workbooks.Add();
            excelApp.Visible = true;

            Excel.Range targetRange = excelApp.Range["A1"];
            targetRange.Value = "Name";
        }

        static void CSharp2008()
        {
            var excelApp = new Excel.Application();
            excelApp.Workbooks.Add(Type.Missing);
            excelApp.Visible = true;

            Excel.Range targetRange = excelApp.get_Range("A1", Type.Missing);
            targetRange.set_Value(Type.Missing, "Name");
            // Or
            //targetRange.Value2 = "Name";
        }
    }
}

関連項目