4

コンポーネントのインデクサー (別名既定のプロパティ) にアクセスできる従来の ASP で使用されるコンポーネントを C# で記述しようとしています。

例:
C# コンポーネント:

public class MyCollection {
    public string this[string key] {
        get { /* return the value associated with key */ }
    }

    public void Add(string key, string value) {
        /* add a new element */
    }
}

ASP コンシューマー:

Dim collection
Set collection = Server.CreateObject("MyCollection ")
Call collection.Add("key", "value")
Response.Write(collection("key")) ' should print "value"

設定する必要がある属性はありますか、インターフェイスを実装する必要がありますか、それとも何か他のことをする必要がありますか? または、これは COM Interop 経由では不可能ですか?

目的は、これらの既定のプロパティ ( などRequest.QueryString("key")) を使用してコレクションを利用する、Request などの組み込み ASP オブジェクトの一部のテスト ダブルを作成しようとすることです。代替提案は大歓迎です。

更新: フォローアップの質問をしました: VBScript から .NET コンポーネントのインデクサーに常にアクセスできるとは限らないのはなぜですか?

4

3 に答える 3

4

こちらのMSDN ドキュメントで説明されているように、プロパティの DispId 属性を 0 に設定してみてください。

于 2008-11-18T16:50:16.850 に答える
0

Rob Walkerのヒントのおかげで、MyCollectionに次のメソッドと属性を追加することで機能するようになりました。

[DispId(0)]
public string Item(string key) {
    return this[key];
}

編集:インデクサーを使用するこのより良いソリューションを参照してください。

于 2008-11-19T07:43:28.013 に答える
0

Itemメソッドではなくインデクサーを使用するより良いソリューションを次に示します。

public class MyCollection {
    private NameValueCollection _collection;

    [DispId(0)]
    public string this[string name] {
        get { return _collection[name]; }
        set { _collection[name] = value; }
    }
}

次のような ASP から使用できます。

Dim collection
Set collection = Server.CreateObject("MyCollection")
collection("key") = "value"
Response.Write(collection("key")) ' should print "value"

注: でインデクサー をオーバーロードしたため、以前はこれを機能させることができませんでしthis[string name]this[int index]

于 2008-11-23T00:25:05.370 に答える