2008-11-18 1 views
4

Я пытаюсь написать компонент на C#, который будет использоваться классическим ASP, который позволит мне получить доступ к индектору компонента (aka default property).Предоставление свойства indexer/default через COM Interop

Например:
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")). Альтернативные предложения приветствуются.

Обновление: Я задал дополнительный вопрос: Why is the indexer on my .NET component not always accessible from VBScript?

ответ

3

Попробуйте установить атрибут DISPID свойства равным 0, как описано здесь, в MSDN documentation.

+0

Спасибо, это заработало, но не на этой [строковой клавише]. Я должен был применить DispId к другому свойству, прежде чем он сработает. – 2008-11-19 07:37:14

0

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

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

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

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].