Предоставление свойства indexer / default через COM Interop
-
08-07-2019 - |
Вопрос
Я пытаюсь написать компонент на 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];
}
Изменить. см. это лучшее решение , в котором используется индексатор.