Вопрос

Я пытаюсь написать компонент на 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?

Это было полезно?

Решение

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top