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

インデックス付きプロパティによって、パラメーターを持つ COM プロパティを C# プログラミングで使用する方法が改善されます。 インデックス付きプロパティは、名前付き引数と省略可能な引数、新しい型 (dynamic)、埋め込み型情報など、Visual C# 2010 で導入された他の機能と連携して動作します。これにより、Microsoft Office プログラミングが強化されます。

以前のバージョンの 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"];

注意

上記の例では、Visual C# 2010 で導入された省略可能な引数機能を使用することもできます。この機能を使用すると、Type.Missing を省略できます。

同様に、Visual C# 2008 以前で、Range オブジェクトの Value プロパティの値を設定するには、2 つの引数が必要です。 1 つは、範囲値の型を指定する省略可能なパラメーターの引数です。 もう 1 つは、Value プロパティの値を指定します。 Visual C# 2010 より前の C# では、引数を 1 つしか指定できませんでした。 このため、通常の set メソッドを使用するのではなく、set_Value メソッドかまたは別のプロパティ (Value2) を使用する必要がありました。 これらの方法について、次の例で説明します。 どちらの場合も、セル A1 の値が Name に設定されます。

// Visual C# 2008.
targetRange.set_Value(Type.Missing, "Name");
// Or
targetRange.Value2 = "Name";

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

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

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

使用例

コード例全体を次に示します。 Office API にアクセスするプロジェクトの設定方法の詳細については、「方法: Visual C# 2010 の機能を使用して Office 相互運用オブジェクトにアクセスする (C# プログラミング ガイド)」を参照してください。

// 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();
            //CSharp2008();
        }

        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";

        }
    }
}

参照

処理手順

方法: Office プログラミングで名前付き引数と省略可能な引数を使用する (C# プログラミング ガイド)

方法: Visual C# 2010 の機能を使用して Office 相互運用オブジェクトにアクセスする (C# プログラミング ガイド)

参照

dynamic (C# リファレンス)

概念

名前付き引数と省略可能な引数 (C# プログラミング ガイド)

その他の技術情報

dynamic 型の使用 (C# プログラミング ガイド)

チュートリアル: Office のプログラミング (C# および Visual Basic)