Предоставление свойства indexer / default через COM Interop - PullRequest
4 голосов
/ 18 ноября 2008

Я пытаюсь написать компонент на C # для использования классическим ASP, который позволяет мне получить доступ к индексатору компонента (так называемое свойство по умолчанию).

Например:
Компонент 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?

Цель состоит в том, чтобы я пытался создать тестовые дубликаты для некоторых встроенных объектов ASP, таких как Request, которые используют коллекции с использованием этих свойств по умолчанию (например, Request.QueryString("key")). Альтернативные предложения приветствуются.

Обновление: я задал дополнительный вопрос: Почему индексатор на моем компоненте .NET не всегда доступен из VBScript?

Ответы [ 3 ]

3 голосов
/ 18 ноября 2008

Попробуйте установить для атрибута DispId свойства значение 0, как описано здесь в документации MSDN .

0 голосов
/ 23 ноября 2008

Вот лучшее решение, которое использует индексатор, а не 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].

0 голосов
/ 19 ноября 2008

Благодаря совету Роба Уокера, я заработал, добавив следующий метод и атрибут в MyCollection:

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

Редактировать: см. это лучшее решение , в котором используется индексатор.

...